2013-07-26 122 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 - 这将在服务器的时区中。因此,如果世界上其他地区的用户在您的服务器前一天仍在使用新月的第一天,则您的比较将失败。