1

我正在尝试使用给定格式解析日期,但我发现这是我无法解释的:

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 中完成):使用公制系统和短日期格式“dd-MMM-yyyy”。

更新:

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

具有我的覆盖的cultureInfo 具有'-' 作为分隔符,而原始文化具有'/'。

为了使 ParseExact 解析日期而不考虑指定的区域性分隔符,格式规范应从"dd/MM/yy"更改为"dd'/'MM'/'yy"

4

1 回答 1

3

从 MSDN 为CultureInfo.GetCultureInfo(string)

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

MSDN 为CultureInfo(string)

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

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

于 2012-06-15T20:23:11.480 回答