我试图用给定的格式解析日期,而且我发现了这个我无法解释的日期:
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;
答案 0 :(得分:3)
来自CultureInfo.GetCultureInfo(string)
的MSDN如果name是当前区域性的名称,则返回的CultureInfo对象不会反映任何用户覆盖。
如果与name关联的区域性标识符与当前Windows区域性的区域性标识符匹配,则此构造函数将创建一个使用这些替换的CultureInfo对象。
这意味着静态GetCultureInfo(string)
将不会使用用户已覆盖的任何设置,而构造函数将使用。