2013-07-26 88 views
1

我想檢查選定的月份是否已經過去。C#比較月份

if (Convert.ToDateTime(DDMonths.SelectedItem.Text).Month > DateTime.Now.Month) 
{ 
     //logic here if date is not in the past 
} 

DDMonths.SelectedItem.TextApril

不過我正在以下格式異常錯誤:

String was not recognized as a valid DateTime.

回答

2

Convert.ToDateTime無法理解你的日期格式,你需要使用DateTime.ParseExact代替:

if(DateTime.ParseExact(DDMonths.SelectedItem.Text, "MMMM", CultureInfo.CurrentCulture).Month > DateTime.Now.Month) { 
    ... 
} 
+0

完美謝謝 – user1986761

1

這意味着,訂單

Convert.ToDateTime(DDMonths.SelectedItem.Text) 

是給你的錯誤。你應該有以下使用

DateTime.ParseExact(DDMonths.SelectedItem.Text,"MMMM",CultureInfo.InvariantCulture); 
5

可以解析月份的名字:

DateTime.ParseExact(DDMonths.SelectedItem.Text, "MMMM", CultureInfo.CurrentCulture).Month 

但是,你會更好使每個元素的ValueDDMonths對應的整數值如果可能的話,改爲月。

+0

絕對是一種方式。節省解析日期的時間,並引入數據/表示分離。使用下拉菜單的「數值」來跟蹤月份的數量,使用「文本」按照用戶選擇的語言顯示名稱。那麼你只需做'if(DDMonths.SelectedItem.Value> DateTime.Now.Month)'。 – ykb

0

你應該使用ParseExact變種DateTime

DateTime.ParseExact("April", "MMMM", CultureInfo.InvariantCulture).Month // outputs 4 

你也應該使用嘗試ValueDDMonths.SelectedItem.Value)組件並根據需要填充它

1

因此,DropDownList-ItemText不能轉換爲DateTime與當前的文化。所以,也許你正在顯示月份名稱(我假設)或錯誤是更多的細節。您可以使用ListItem.Value於日期存儲在一個特定的格式,例如:

"yyyyMMdd" - >"20130726"

然後,你可以這樣分析它:

var dt = DateTime.ParseExact("20130726", "yyyyMMdd", CultureInfo.InvariantCulture); 

如果你想允許月份名稱:

dt = DateTime.ParseExact("July", "MMMM", CultureInfo.InvariantCulture); 
1

由於您只是在尋找月份的編號,爲什麼要將其解析爲DateTime?你可以從DateTimeFormatInfo直接得到它:

string input = "April"; 

var months = DateTimeFormatInfo.CurrentInfo.MonthNames; 
var monthNumber = 1 + Array.FindIndex(months, x => x.Equals(input, StringComparison.CurrentCultureIgnoreCase)); 
if (monthNumber > DateTime.Now.Month) 
{ 
    // ... 
} 

不要去想你想要做的,如果它是目前四月的東西。根據你在做什麼,你可能想用>=進行比較。另外,如果你正在編寫一個桌面應用程序,這個代碼(和其他)就很好。但是,如果你正在編寫一個Web應用程序,該代碼運行服務器端,那麼你有兩個額外的關切:

  • 的文化應該匹配輸入。您可能需要使用不同的文化,或InvariantCulture
  • 您正在比較DateTime.Now - 這將在服務器的時區中。因此,如果世界上其他地區的用戶在您的服務器前一天仍在使用新月的第一天,則您的比較將失敗。