我正在尝试检查所选月份是否已经过去。
if (Convert.ToDateTime(DDMonths.SelectedItem.Text).Month > DateTime.Now.Month)
{
//logic here if date is not in the past
}
DDMonths.SelectedItem.Text
值为April
但是我收到以下格式异常错误:
字符串未被识别为有效的日期时间。
您可以使用以下内容按名称解析月份:
DateTime.ParseExact(DDMonths.SelectedItem.Text, "MMMM", CultureInfo.CurrentCulture ).Month
但是,如果可能的话,最好将整数值Value
中的每个元素都设置为对应于月份的值。DDMonths
Convert.ToDateTime
无法理解您的日期格式,您需要使用DateTime.ParseExact代替:
if(DateTime.ParseExact(DDMonths.SelectedItem.Text, "MMMM", CultureInfo.CurrentCulture).Month > DateTime.Now.Month) {
...
}
这意味着你的线路
Convert.ToDateTime(DDMonths.SelectedItem.Text)
给你错误。你应该使用
DateTime.ParseExact(DDMonths.SelectedItem.Text,"MMMM",CultureInfo.InvariantCulture);
因此,您的Text
of yourDropDownList-Item
不能转换为DateTime
当前文化。所以也许你正在显示月份名称(我假设)或者错误更微妙。您可以使用ListItem.Value
以特定格式存储日期时间,例如:
"yyyyMMdd"
->"20130726"
然后你可以这样解析它:
var dt = DateTime.ParseExact("20130726", "yyyyMMdd", CultureInfo.InvariantCulture);
如果您想允许月份名称:
dt = DateTime.ParseExact("July", "MMMM", CultureInfo.InvariantCulture);
既然你只是在寻找月份的数字,为什么要把它解析为 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 日使用它,而您的服务器仍在前一天,那么您的比较将失败。您应该使用的ParseExact
变体DateTime
DateTime.ParseExact("April", "MMMM", CultureInfo.InvariantCulture).Month // outputs 4
您还应该尝试使用Value
(DDMonths.SelectedItem.Value)组件并根据需要填充它