DateTime.Parse 抛出 FormatException 而不管 CultureInfo

DateTime.Parse throws FormatException regardless of CultureInfo

我的机器配置了欧洲日期格式:dd/MM/yyyy

当运行以下任何一行时:

DateTime.Parse("11/15/2017 12:00:00 AM");
DateTime.Parse("11/15/2017 12:00:00 AM", CultureInfo.CreateSpecificCulture("en-US"));
DateTime.Parse("11/15/2017 12:00:00 AM", CultureInfo.CreateSpecificCulture("fr-FR"));
DateTime.Parse("11/15/2017 12:00:00 AM", CultureInfo.CreateSpecificCulture("en-GB"));

我得到

System.FormatException: String was not recognized as a valid DateTime.

为什么任何文化信息都不允许我解析这个日期?我知道字符串最初是在哪种文化中创建的(使用 DateTime.ToString()),但仅此而已,所以我不想使用 ParseExact,除非有一些 API 来获取默认值每种文化的格式字符串。

如您所述,您的配置为 dd/MM/yyyy

因此"11/15/2017 12:00:00 AM"无效。应该是:

"15/11/2017 12:00:00 AM"`

最好使用 ParseExact,您可以在其中指定输入字符串的格式。尝试:

DateTime.ParseExact("11/15/2017 12:00:00 AM", "MM/dd/yyyy", System.Globalization.CultureInfo.GetCultureInfo("en-US"));

这在日期模式保留为默认值的机器上确实有效:

var culture = CultureInfo.CreateSpecificCulture("en-US");
Console.WriteLine(culture.DateTimeFormat.ShortDatePattern);
Console.WriteLine(culture.DateTimeFormat.ShortTimePattern);
var date = DateTime.Parse("11/15/2017 12:00:00 AM", culture);
Console.WriteLine(date);

en-US 的默认日期模式是“M/d/yyyy”,时间模式是“h:mm tt”。

这适用,除非您针对当前文化修改系统设置,并且该文化是 en-US。

如果您想绕过自定义设置,请创建一个 new CultureInfo("en-US", false)