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

本文关键字:CurrentCulture 失败 CultureInfo 会因 DateTime ParseExact 为什么 | 更新日期: 2023-09-27 18:37:26

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

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 中失败,在使用 Culture 名称创建的新实例时失败,但在使用 GetCultureInfo() 获得的区域性时不会失败。当前区域性是 en-US,Windows 配置了以下两项更改(在 intl.cpl 中完成):使用公制系统和短日期格式"dd-MMM-yyyy"。

更新:

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

具有我的覆盖的 cultureInfo 具有"-"作为分隔符,而原始区域性具有"/"。

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

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

来自 MSDN for CultureInfo.GetCultureInfo(string)

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

MSDN for CultureInfo(string)

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

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