1

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

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

DDMonths.SelectedItem.Text值为April

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

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

4

6 回答 6

5

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

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

但是,如果可能的话,最好将整数值Value中的每个元素都设置为对应于月份的值。DDMonths

于 2013-07-26T07:39:16.103 回答
2

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

if(DateTime.ParseExact(DDMonths.SelectedItem.Text, "MMMM", CultureInfo.CurrentCulture).Month > DateTime.Now.Month) {
  ...
}
于 2013-07-26T07:39:40.590 回答
1

这意味着你的线路

 Convert.ToDateTime(DDMonths.SelectedItem.Text)

给你错误。你应该使用

DateTime.ParseExact(DDMonths.SelectedItem.Text,"MMMM",CultureInfo.InvariantCulture);
于 2013-07-26T07:39:08.980 回答
1

因此,您的Textof yourDropDownList-Item不能转换为DateTime当前文化。所以也许你正在显示月份名称(我假设)或者错误更微妙。您可以使用ListItem.Value以特定格式存储日期时间,例如:

"yyyyMMdd"->"20130726"

然后你可以这样解析它:

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

如果您想允许月份名称:

dt = DateTime.ParseExact("July", "MMMM", CultureInfo.InvariantCulture);
于 2013-07-26T07:42:37.900 回答
1

既然你只是在寻找月份的数字,为什么要把它解析为 aDateTime呢?您可以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- 这将在服务器的时区中。因此,如果世界其他地方的用户在新月 1 日使用它,而您的服务器仍在前一天,那么您的比较将失败。
于 2013-07-27T18:04:23.637 回答
0

您应该使用的ParseExact变体DateTime

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

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

于 2013-07-26T07:40:23.453 回答