问题描述
刚刚迁移到 .Net 5。
下一个代码在“日期”变量中返回“01/01/0001 00:00:00 +00:00”。
DateTime.TryParseExact(
"Июн 16 2021","MMМ d yyyy",CultureInfo.CreateSpecificCulture("ru-RU"),DateTimeStyles.None,out DateTime date
);
https://dotnetfiddle.net/E5VDbH
在 .Net Core 3.1 上没问题。
有人遇到过同样的问题吗?
解决方法
我与@PMF 的方向相同,并打印出 ru-RU
文化的所有月份名称。从中我可以看出,没有与示例中的月份缩写相匹配的月份缩写。以下是获取所有有效值的方法:
var ci = CultureInfo.CreateSpecificCulture("ru-RU");
Console.WriteLine(String.Join(" - ",ci.DateTimeFormat.AbbreviatedMonthNames));
看到我们在六月,我怀疑 Июн
也应该是六月,在 .NET 5 中缩写为 июнь
。
我不会读或写俄语,所以我不知道这些与您的期望相比如何,但这至少是 .NET 5 的期望。
当我在您的示例中将 Июн
替换为 июнь
时,它正确地将其解析为日期。
如果您使用 DateTime.ParseExact()
并将代码括在 try/catch
中,您可能已经看到了这一点。你会有一个例外告诉你:
字符串 'Июн 16 2021' 未被识别为有效的 DateTime。
这可以为您指明正确的方向。
,这是 .NET 5 中的一项重大更改,其中 Globalization APIs use ICU libraries on Windows。为了保持旧的行为,you can add the following to the .csproj file
<ItemGroup>
<RuntimeHostConfigurationOption Include="System.Globalization.UseNls" Value="true" />
</ItemGroup>
其他选项在runtimeconfig.json上设置“System.Globalization.UseNls”
{
"runtimeOptions": {
"configProperties": {
"System.Globalization.UseNls": true
}
}
}
或将环境变量 DOTNET_SYSTEM_GLOBALIZATION_USENLS
设置为 true
或 1
。