# 使用DateTime.TryParse()取代Convert.DateTime()
###### 發布日期:2017-08-03 | 存檔日期:2023-06-17
###### 原文網址:https://bmtnote.blogspot.com/2017/08/datetimetryparseconvertdatetime.html
這篇文章是今天實習時,正職的同事希望我能夠了解在C#中使用DateTime.Parse()和Convert.DateTime()的差別,找到的其中一篇英文文章是在敘說使用DateTime.TryParse()替代包括Convert.DateTime()和DateTime.Parse()在內的其他方式。
是不是一定要用某種方法我想是因情況而定啦... 不過文章有解釋關於DateTime.Parse()和Convert.DateTime()之間的關係,在閱讀時就順便將他翻譯成中文,以下是隨意翻譯的內容:
原文標題:[Why use DateTime.TryParse() instead of Convert.DateTime()](http://dotnetinterviewcracker.blogspot.tw/2013/01/why-use-datetimetryparse-instead-of.html)
翻譯標題:為何要使用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訊息。
```C#=1
// 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()執行時大致上就如同下面的虛擬碼:
```C#=+
// 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()是更有效率的作法,這個方法可以避免程式層層呼叫,並且不會回傳一個沒有意義的例外狀況錯誤訊息。
###### tags: `C#` `blogspot存檔` `Public`