2017年8月3日 星期四

[C#]使用DateTime.TryParse()取代Convert.DateTime()

  這篇文章是今天實習時,正職的同事希望我能夠了解在C#中使用DateTime.Parse()和Convert.DateTime()的差別,找到的其中一篇英文文章是在敘說使用DateTime.TryParse()替代包括Convert.DateTime()和DateTime.Parse()在內的其他方式。

  是不是一定要用某種方法我想是因情況而定啦... 不過文章有解釋關於DateTime.Parse()和Convert.DateTime()之間的關係,在閱讀時就順便將他翻譯成中文,以下是隨意翻譯的內容:

原文標題:Why use DateTime.TryParse() instead of Convert.DateTime()
翻譯標題:為何要使用DateTime.TryParse()替代Convert.DateTime()?

  Convert.ToDateTime()其實是在內部呼叫 DateTime.Parse()這個函式將字串轉換為日期格式,而DateTime.Parse()的日期格式參數則是直接傳入本機的設定,也可在字串參數傳入null則會回傳該日期格式的最小值。

  簡單來說,就是Convert.ToDateTime()無法自行依據各地時間文化設定格式,如果要自行設定就得使用DtateTime.Parse()。

  註:如果不確定字串是不是合法的時間格式,可以使用DateTime.TryParse()進行確認。

  如果你已經確定字串屬於不合法的時間格式,但是你知道這個時間格式的規律,可以使用DateTime.ParseExact()或DateTime.TryParseExact()的方式。需要注意在某些情況下DateTime.Parse()會執行失敗。(因為Conver.ToDateTime()實際上是使用DateTime.Parse()內部轉換,所以這些情況也適用於Conver.ToDateTime())


  參考下方提供的情境:

  當使用者輸入一個不合法的日期格式,DateTime.Parse()會回傳FormatException訊息。
// throws FormatException, not a valid format
var dt1 = DateTime.Parse("");

// throws FormatException, February doesn’t have a 30th day, not a valid date
var dt2 = DateTime.Parse("02/30/2010 12:35");
註:建議使用DateTime.TryParse()模式避免發生例外情況,特別是程式允許使用者手動輸入的情況下。


  要注意的是,DateTime.Parse()其實就是DateTime.TryParse(),只不過是在處理例外狀況時,將事件丟給TryParse()處理並回傳false而已。因此,Parse()執行時大致上就如同下面的虛擬碼:
// rough psuedo-code of Parse()
public DateTime Parse(string inputString)
{
DateTime result;
if (!DateTime.TryParse(inputString, out result))
{
throw new FormatException(...);
}
return result;
}


  所以直接呼叫DateTime.TryParse()是更有效率的作法,這個方法可以避免程式層層呼叫,並且不會回傳一個沒有意義的例外狀況錯誤訊息。

沒有留言:

張貼留言