這篇文章是實習時,正職的同事希望我能夠了解在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()
是更有效率的作法,這個方法可以避免程式層層呼叫,並且不會回傳一個沒有意義的例外狀況錯誤訊息。