为什么DateTime.ParseExact会因CultureInfo.CurrentCulture失败?

时间:2012-06-15 20:17:39

标签: c# parsing datetime

我试图用给定的格式解析日期,而且我发现了这个我无法解释的日期:

var date = new DateTime(2001, 01, 10);

var cultureInfo1 = CultureInfo.GetCultureInfo(CultureInfo.CurrentCulture.Name);
var cultureInfo2 = new CultureInfo(CultureInfo.CurrentCulture.Name);

Assert.AreEqual(date, DateTime.ParseExact("10/01/01", "dd/MM/yy", cultureInfo1));

Assert.Throws<FormatException>(() => DateTime.ParseExact("10/01/01", "dd/MM/yy", CultureInfo.CurrentCulture));
Assert.Throws<FormatException>(() => DateTime.ParseExact("10/01/01", "dd/MM/yy", cultureInfo2));

为什么此调用会因CurrentCulture失败,使用文化名称创建的新实例失败但未使用GetCultureInfo()获取的文档失败。当前的文化是en-US,Windows配置了这两个更改(在intl.cpl中完成):使用Metric系统和短日期格式&#dd-MMM-yyyy&#39;。

更新

原始问题得到了正确回答,但我想补充一点,两种文化都能够解析日期。问题似乎在于CultureInfo.DateTimeFormat.DateSeparator中指定的日期分隔符。

拥有我的覆盖的cultureInfo有&#39; - &#39;作为分隔符,而原始文化有&#39; /&#39;。

要使ParseExact解析日期而不考虑文化指定的分隔符,格式规范应该从&#34; dd / MM / yy&#34; 更改为&#34; DD&#39; /&#39; MM&#39; /&#39; YY&#34;

1 个答案:

答案 0 :(得分:3)

来自CultureInfo.GetCultureInfo(string)

的MSDN
  

如果name是当前区域性的名称,则返回的CultureInfo对象不会反映任何用户覆盖。

CultureInfo(string)

的MSDN
  

如果与name关联的区域性标识符与当前Windows区域性的区域性标识符匹配,则此构造函数将创建一个使用这些替换的CultureInfo对象。

这意味着静态GetCultureInfo(string)将不会使用用户已覆盖的任何设置,而构造函数将使用。