2016-08-15 62 views
0

我有一個過濾器字段,允許通過部分或全部日期進行搜索,可以輸入不同的格式 - 即用戶想要輸入它的方式,所以TryParseExact不看像最好的選擇。DateTime.TryParse在yyyy失敗

的問題是,下面的代碼:

DateTime.TryParse(fromDate.Text, CultureInfo.InvariantCulture, DateTimeStyles.None, out dateFromValue) 

解析一切,但YYYY字符串。例如。 「05/1980」和「1980/05」被確認爲{1/05/1980 12:00:00 AM},但「1980」失敗。

我懷疑解析器無法區分,比如說,yyyy和ffff,當它得到的是一個4位數的序列,但我仍然需要得到這個工作。有沒有比這更優雅的方式來做到這一點?

if(!DateTime.TryParse("1980", CultureInfo.InvariantCulture, DateTimeStyles.None, out date)) 
    DateTime.TryParseExact("1980","yyyy",CultureInfo.InvariantCulture, DateTimeStyles.None, out date); 

還是我這樣做是完全錯誤的?

預先感謝您!

回答

2

我認爲你不能僅僅使用DateTime.Parse,因爲月和日是不明確的。使用具有特定日期格式的DateTime.ParseExact或DateTime.TryParseExact可以代替。

如果您的條件對我來說看起來不合適,但您如何結合這兩個條件?

if(!DateTime.TryParse("1980", CultureInfo.InvariantCulture, DateTimeStyles.None, out date)) 
DateTime.TryParseExact("1980","yyyy",CultureInfo.InvariantCulture, DateTimeStyles.None, out date); 

應該是:

if(DateTime.TryParse("1980", CultureInfo.InvariantCulture, DateTimeStyles.None, out date) || 
DateTime.TryParseExact("1980","yyyy",CultureInfo.InvariantCulture, DateTimeStyles.None, out date)) 
// If the first parse success, use that. Otherwise, try to parse the year only with the parseexact. 
// Notice the || and the first condition needs to be positive. 
+0

好一點 - 我要多加小心當copypasting!感謝您指出:) 在這種特殊情況下,我會與TryParse一起猜測缺失的日期和月份(例如默認1月1日) - 如果只有它可以做到這一點:( –

0

如果您想要部分匹配,最簡單的方法是將日期視爲字符串,並使用字符串匹配而不是依賴日期格式。

+0

我一直在考慮,但的TryParse _mostly_工作,所以要把它_fully_工作看起來確實很誘人:) –