为什么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'
答案 0 :(得分:6)
"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” - 虽然不适用于此格式)
答案 1 :(得分:2)
根据当前线程的区域性设置(由Windows控制面板中的区域设置确定)解析日期/时间字符串。
例如,如果当前文化是 fr-FR 或 en-GB ,则输入应采用day/month/year
格式。如果当前文化是 en-US ,则输入应采用month/day/year
格式。
您可以查看Thread.CultureInfo property的Thread.CurrentThread来查找当前主题的文化设置。
如果您不想根据当前线程的区域性设置解析日期/时间字符串,则必须明确指定区域性设置。
您的输入似乎是 en-US 格式,而您的系统似乎配置为 fr-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