.Net 5 DateTime.ParseExact 问题

问题描述

刚刚迁移到 .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 设置为 true1