C# 奇怪的Convert.ToDateTime行为

C# 奇怪的Convert.ToDateTime行为,c#,.net,datetime,C#,.net,Datetime,为什么Convert.ToDateTime对于以下值的行为异常 以下几点效果不错: var value = "08/01/2011"; var dateTime = Convert.ToDateTime(value); 结果是:{08/01/2011 00:00:00}——这是意料之中的 但是现在,当我这样做的时候: var value = "07/21/2011"; var dateTime = Convert.ToDateTime(value); 我得到一个例外: “Convert.To

为什么
Convert.ToDateTime
对于以下值的行为异常

以下几点效果不错:

var value = "08/01/2011";
var dateTime = Convert.ToDateTime(value);
结果是:
{08/01/2011 00:00:00}
——这是意料之中的

但是现在,当我这样做的时候:

var value = "07/21/2011";
var dateTime = Convert.ToDateTime(value);
我得到一个例外:

“Convert.ToDateTime(“07/21/2011”)”引发了“System.FormatException”类型的异常。

"07/21/2011";
这不是有效日期,因为
21
将被解释为月份

请尝试显式指定格式:

DateTime myDate = DateTime.ParseExact("07/21/2011", "MM/dd/yyyy", 
                                      CultureInfo.InvariantCulture);
编辑:

同意@dtb的评论-我只是找不到您指定的日期是合法的文化。但一般形式是:

DateTime myDate = Convert.ToDateTime("07/21/2011", new CultureInfo("XXX"))

其中,
XXX
是您要使用的区域性名称(即“en GB”-但不适用于此格式)

根据当前线程的区域性设置(由Windows控制面板中的区域设置确定)解析日期/时间字符串

例如,如果当前区域性为fr或en GB,则输入应为
day/month/year
格式。如果当前区域性为en US,则输入应为
月/日/年
格式

通过查看的,可以找到当前线程的区域性设置

如果不想根据当前线程的区域性设置分析日期/时间字符串,则必须显式指定区域性设置

您的输入似乎是en US格式,而您的系统似乎配置为fr或en GB。因此,明确指定en US作为文化:

DateTime result = DateTime.Parse("07/21/2011", new CultureInfo("en-US"));
// result.Day   == 21
// result.Month == 7
// result.Year  == 2011
第一个示例之所以有效,是因为
1
是一个有效的月份,与
21
不同

DateTime result = DateTime.Parse("08/01/2011", new CultureInfo("fr-FR"));
// result.Day   == 8
// result.Month == 1
// result.Year  == 2011

日期的区域设置可能是dd/mm/yyyy@Koen:然后如何检查我的区域设置并相应地设置字符串值的格式?更好的方法是:明确说明您希望在其中设置输入格式的区域性。@dtb:如何获取区域性信息?@Ruby:通常是特定于国家/地区的-您想使用的系统在哪里在?
DateTime myDate=DateTime.Parse(“2011年7月21日,新文化信息”)有效(2011年7月21日)。哦,我想我没有尝试显而易见的东西。这属于“树木看不见森林”类别