驗證時間的方式

  • 2404
  • 0

今天看到朋友寫了一段程式是用來判斷日期格式是否正確

今天看到朋友寫了一段程式是用來判斷日期格式是否正確

try
{
    int year = int.Parse(dateString.Substring(0, 4));
    int MM = int.Parse(dateString.Substring(4, 2));
    int dd = int.Parse(dateString.Substring(6, 2));
    DateTime datetime = new DateTime(year, MM, dd);
    _result = true;
}
catch (Exception)
{
    _result = false;
}

第一眼看到的感覺是.net應該有TryParse系列的method來處理型態的轉換吧

朋友說因為傳進DateTime.TryParse明明是正確的日期格式,但是卻回傳false

看一看程式員邏輯感覺好像是傳入20091010的值,但是DateTime.TryParse應該要傳入的格式是yyyy/MM/dd才對

當然會出錯,不過實務上在開發時日期本來就有很多種格式了,只是這時候DateTime.TryParse就不方便了

此時有DateTime.TryParseExact可以用

可以改成這樣

 

DateTime _datetime;        
_result = DateTime.TryParseExact(
        dateString, 
        "yyyyMMdd", 
        DateTimeFormatInfo.InvariantInfo, 
        DateTimeStyles.None, out _datetime
    );

改完後當然要檢查一下效能會不會變比較差囉

DateTime _datetime;          
string datetimeString = "20100404";
Stopwatch _watch = new Stopwatch();
_watch.Start();
for (int i = 0; i < 1000000; i++)
{
    int year = int.Parse(datetimeString.Substring(0, 4));
    int MM = int.Parse(datetimeString.Substring(4, 2));
    int dd = int.Parse(datetimeString.Substring(6, 2));
    DateTime datetime = new DateTime(year, MM, dd);
}
_watch.Stop();
Response.Write(string.Format("使用 :{0} 秒<br/>", _watch.ElapsedMilliseconds / 1000d));
_watch = Stopwatch.StartNew();

for (int i = 0; i < 1000000; i++)
{
    DateTime.TryParseExact(datetimeString, "yyyyMMdd", DateTimeFormatInfo.InvariantInfo, DateTimeStyles.None, out _datetime);
}
Response.Write(string.Format("使用 :{0} 秒<br/>", _watch.ElapsedMilliseconds / 1000d));

可以放心了,沒有比較慢

反而測試是TryParseExact比較快

整個method比較要注意的是IFormatProvider這個參數,因為datetime的時間格是比較容易因為地區語言有不一樣

不過我想不管是哪裡 傳入yyyyMMdd應該都是沒什麼問題才是

參考資料

http://msdn.microsoft.com/zh-tw/library/ms131044%28v=VS.90%29.aspx