C# DateTime.Parse的奇怪行为

C# DateTime.Parse的奇怪行为,c#,.net,datetime,C#,.net,Datetime,我们有一个大型应用程序(不幸的是)经常使用DateTime.Parse(文本)。用更好的东西替换DateTime.Parse现在不是一个选项 最近我升级了windows(到windows 10)并开始出现问题。根据文档,该方法应使用CultureInfo.CurrentCulture作为默认的formatprovider。在我的电脑上似乎不是这样,除非我遗漏了一些明显的东西 下面的代码调用函数两次,首先不更改任何区域性设置,然后在区域性和ui区域性上设置挪威区域性。 出于某种原因,在这两种情况下

我们有一个大型应用程序(不幸的是)经常使用DateTime.Parse(文本)。用更好的东西替换DateTime.Parse现在不是一个选项

最近我升级了windows(到windows 10)并开始出现问题。根据文档,该方法应使用CultureInfo.CurrentCulture作为默认的formatprovider。在我的电脑上似乎不是这样,除非我遗漏了一些明显的东西

下面的代码调用函数两次,首先不更改任何区域性设置,然后在区域性和ui区域性上设置挪威区域性。 出于某种原因,在这两种情况下,它都能够解析以en-US格式(M/d/yyyy)给出的文本,但无法解析CultureInfo所需格式的日期

这是怎么回事?我希望我错过了一些明显的东西

类程序
{
静态void Main(字符串[]参数)
{
var norwegianCulture=新文化信息(“nb编号”);
控制台。写入线(“第一”);
解析日期();
Console.WriteLine(“\n秒”);
Thread.CurrentThread.CurrentUICulture=挪威文化;
解析日期();
Console.ReadKey();
}
私有静态void ParseDates()
{
Console.WriteLine($“CultureInfo.CurrentCulture:{CultureInfo.CurrentCulture}”);
Console.WriteLine($“CultureInfo.CurrentUICulture:{CultureInfo.CurrentUICulture}”);
WriteLine($“{Thread.CurrentThread.CurrentCulture}-CurrentCulture-{Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortDatePattern}”);
WriteLine($“{Thread.CurrentThread.CurrentUICulture}-CurrentUICulture-{Thread.CurrentThread.CurrentUICulture.DateTimeFormat.ShortDatePattern}”);
var shortDateString=new DateTime(2015,9,5).ToSortDateString();
WriteParseDate(shortDateString);
书面授权日期(“2015年1月2日”);
Console.WriteLine();
}
私有静态void writeParseDate(字符串shortDateString)
{
尝试
{
var d=DateTime.Parse(shortDateString,CultureInfo.CurrentCulture);
WriteLine($“文本{shortDateString}解析为年:{d.Year},月:{d.Month},日:{d.Day}”);
}
捕获(例外e)
{
WriteLine($“无法解析文本{shortDateString}”);
WriteLine($“错误:{e.Message}”);
}
}
}
将其写入控制台:

First
CultureInfo.CurrentCulture: nb-NO
CultureInfo.CurrentUICulture: en-US
nb-NO - CurrentCulture - dd.MM.yyyy
en-US - CurrentUICulture - M/d/yyyy
The text 05.09.2015 could not be parsed.
Error: String was not recognized as a valid DateTime.
The text 1/2/2015 parsed to Year: 2015, Month: 2, Day: 1


Second
CultureInfo.CurrentCulture: nb-NO
CultureInfo.CurrentUICulture: nb-NO
nb-NO - CurrentCulture - dd.MM.yyyy
nb-NO - CurrentUICulture - dd.MM.yyyy
The text 05.09.2015 could not be parsed.
Error: Strengen ble ikke gjenkjent som en gyldig DateTime.
The text 1/2/2015 parsed to Year: 2015, Month: 2, Day: 1

局部解决方法 正如shf301所写,这是由于Windows10中的一个bug造成的


我通过将时间分隔符从“.”改为“:”——成功地让它工作起来,就像旧版本的Windows一样。我想这是因为我们只使用用户设置,而不是手动加载/指定它们。

这是一个公开的错误列表。对于任何具有相同日期和时间分隔符的区域设置,日期解析都会失败

Estonian (Estonia)
Finnish (Finland)
Norwegian Bokmål (Norway)
Norwegian Bokmål (Svalbard and Jan Mayen)
Serbian (Cyrillic, Kosovo)
Serbian (Latin, Montenegro)
Serbian (Latin, Serbia)
Serbian (Latin, Kosovo)
您的示例从不使用US设置解析或格式化日期。首先,
DateTime.Parse
不使用
IFormatProvider
使用
CurrentCulture
而不是
CurrentUICulture
,然后将
CurrentCulture
显式传递到
DateTime.Parse
。这就是为什么两种情况下的输出完全相同

如果使用
en-US
规则解析
“1/2/2015”
,它将输出:

The text 1/2/2015 parsed to Year: 2015, Month: 1, Day: 2
DateTime.Parse
很聪明,假设您使用了
/
作为日期分隔符,而不是
,并将日期解析为
d/M/yyyy


在修复此问题之前,您将不得不将调用更改为
DateTime.Parse
。或者切换到不受影响的.Net 3.5或更早版本。

这似乎也没有在使用en-US,因为如果是这样,那么月份应该是1天,而第2天应该是2天,但您正相反。谢谢!我真的希望这很快得到解决,因为这现在阻止了我们所有的其他开发者升级windows。根据下面的帖子,修复将在9月的windows 10更新中发布:(昨天的更新)没有为我解决这个问题。