奇怪的转换.ToDateTime行为

本文关键字:ToDateTime 行为 转换 | 更新日期: 2023-09-27 18:04:28

为什么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")' threw an exception of type 'System.FormatException'

奇怪的转换.ToDateTime行为

"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-FRen-GB,则期望输入为day/month/year格式。如果当前区域性为en-US,则输入格式为month/day/year

您可以通过查看线程来查找当前线程的区域性设置。Thread.CurrentThread.

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

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

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