我正在尝试使用给定格式解析日期,但我发现这是我无法解释的:
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"。