[存檔][.NET]使用DateTime.TryParse()取代Convert.DateTime()

  • 14275
  • 0
  • 2019-12-30

  這篇文章是實習時,正職的同事希望我能夠了解在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()

// 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()是更有效率的作法,這個方法可以避免程式層層呼叫,並且不會回傳一個沒有意義的例外狀況錯誤訊息。