C# 比较月份

C# 比较月份,c#,datetime,C#,Datetime,我正在尝试检查所选月份是否已经过去 if (Convert.ToDateTime(DDMonths.SelectedItem.Text).Month > DateTime.Now.Month) { //logic here if date is not in the past } DDMonths.SelectedItem.Text值为April 但是,我收到以下格式异常错误: 字符串未被识别为有效的日期时间 这意味着你的台词 Convert.ToDateTime(DDMo

我正在尝试检查所选月份是否已经过去

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

但是,我收到以下格式异常错误:

字符串未被识别为有效的日期时间


这意味着你的台词

 Convert.ToDateTime(DDMonths.SelectedItem.Text)
这是给你的错误。你应该使用

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

这意味着你的台词

 Convert.ToDateTime(DDMonths.SelectedItem.Text)
这是给你的错误。你应该使用

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

您可以使用以下内容按名称解析月份:

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

但是,如果可能的话,最好将
DDMonths
中每个元素的
值改为与月份对应的整数值。

您可以使用以下内容按名称解析月份:

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

但是,如果可能的话,最好将
DDMonths
中每个元素的
值改为与月份对应的整数值。

转换。ToDateTime
无法理解日期格式,您需要改为使用:


Convert.ToDateTime
无法理解日期格式,您需要改用:


您应该使用
DateTime

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

您还应该尝试使用
(DDMonths.SelectedItem.Value)组件,并根据需要填充它

您应该使用
日期时间
变量

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

您还应该尝试使用
Value
(DDMonths.SelectedItem.Value)组件,并根据需要填充它

,这样您的
下拉列表项
文本就不能转换为当前区域性的
日期时间
。因此,可能您正在显示月份名称(我假设的),或者错误更为复杂。您可以使用
列表项.Value
以特定格式存储日期时间,例如:

“yyyyymmdd”
->
“20130726”

然后您可以通过以下方式对其进行分析:

var dt = DateTime.ParseExact("20130726", "yyyyMMdd", CultureInfo.InvariantCulture);
如果要允许monthname:

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

因此,您的
下拉列表项的
文本
在当前区域性下不能转换为
日期时间
。因此,可能您正在显示月份名称(我假设的),或者错误更为复杂。您可以使用
列表项.Value
以特定格式存储日期时间,例如:

“yyyyymmdd”
->
“20130726”

然后您可以通过以下方式对其进行分析:

var dt = DateTime.ParseExact("20130726", "yyyyMMdd", CultureInfo.InvariantCulture);
如果要允许monthname:

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

既然您只是在查找月份的数字,为什么要将其解析为
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)
{
    // ...
}
如果现在是4月,一定要想一想你想做什么。根据您正在执行的操作,您可能希望使用
=
进行比较

此外,如果您正在编写一个桌面应用程序,那么这段代码(以及其他代码)就可以了。但是,如果您正在编写web应用程序,并且此代码正在服务器端运行,那么您还有两个问题:

  • 文化应该与输入相匹配。您可能需要使用不同的区域性,或者
    不变量区域性
  • 您正在与
    DateTime.Now
    -进行比较,后者将位于服务器的时区中。因此,如果世界其他地区的用户在新的一个月的第一天使用此功能,而您的服务器仍在前一天,那么您的比较将失败

既然您只是在查找月份的数字,为什么要将其解析为
日期时间?您可以直接从
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)
{
    // ...
}
如果现在是4月,一定要想一想你想做什么。根据您正在执行的操作,您可能希望使用
=
进行比较

此外,如果您正在编写一个桌面应用程序,那么这段代码(以及其他代码)就可以了。但是,如果您正在编写web应用程序,并且此代码正在服务器端运行,那么您还有两个问题:

  • 文化应该与输入相匹配。您可能需要使用不同的区域性,或者
    不变量区域性
  • 您正在与
    DateTime.Now
    -进行比较,后者将位于服务器的时区中。因此,如果世界其他地区的用户在新的一个月的第一天使用此功能,而您的服务器仍在前一天,那么您的比较将失败

肯定是一条路要走。节省解析日期的时间,并引入数据/表示分离。使用下拉列表中的
跟踪月份编号,并使用
文本
以用户选择的任何语言显示姓名。然后您只需执行
if(DDMonths.SelectedItem.Value>DateTime.Now.Month)
。这绝对是一个好方法。节省解析日期的时间,并引入数据/表示分离。使用下拉列表中的
跟踪月份编号,并使用
文本
以用户选择的任何语言显示姓名。然后您只需执行
if(DDMonths.SelectedItem.Value>DateTime.Now.Month)