2012-07-02 66 views
1

我使用創建日期下面的代碼與驗證

try 
{ 
    newdatetime = new DateTime(2012, 2, 30); 
    break; 
} 
catch (ArgumentOutOfRangeException) 
{ 
    // Try 29 Feb if not 28. 
} 

catch塊是捕捉無效的日期像2月30日創建有效的datetime對象有沒有什麼辦法來驗證,如果日期是speciying有效參數(如年,月,日)?

+3

使用[DateTime.TryParse()](http://msdn.microsoft.com/en-us/library/system.datetime。 tryparse.aspx)而不是? – Bridge

+1

[Wanted:DateTime.TryNew(year,month,day)或DateTime.IsValidDate(year,month,day)]可能的重複](http://stackoverflow.com/questions/9467967/wanted-datetime-trynewyear-month- day-or-datetime-isvaliddateyear-month-d) –

+0

@TimSchmelter當我注意到我提供的示例與此非常相似時,我認爲這很好 - 我巧合! –

回答

5

那麼,有幾個月你知道有效範圍,所以你可以手動約束。在正常意義上,年限顯然不受限制,但受限於DateTime實際可以持有的金額(0001至9999)。

使用天數,有DaysInMonth(int year, int month)方法可以告訴您所提供月份的最大日期。這也給你閏年。

有了這些信息,您可以創建自己的方法來根據提供的整數檢查範圍。

喜歡的東西:

public static bool AreValidDateValues(int year, int month, int day) 
{ 
    if (month < 1 || month > 12) 
     return false; 

    if (year < DateTime.MinValue.Year || year > DateTime.MaxValue.Year) 
     return false; 

    var days = DateTime.DaysInMonth(year, month); 

    if (day < 1 || day > days) 
     return false; 

    return true; 
} 

或者,如果你不能與困擾,轉換原始值到日期的字符串表示和它放入DateTime.TryParse,這將給真/假的提供的字符串 - 只要注意文化敏感的解析。

1

您可以使用DateTime.TryParse執行檢查:

DateTime d; 
var isValid = DateTime.TryParse(String.Format("{0}/{1}/{2}", 2, 31, 2012), out d); 
Console.WriteLine(isValid); 
+0

該字符串格式依賴於區域設置,但對不同的解釋是開放的。按照[這個答案](http://stackoverflow.com/a/4719050/1220971)我建議你使用'TryParseExact()',指定你創建DateTime的格式。否則,如果語言環境預期月份和日期的順序不同,則可能會出現'ArgumentOutOfRangeException'。 – Bridge

+0

@Bridge:同意。將更新與備用..的職位.. – Chandu