.Net 5 DateTime.ParseExact 个问题

.Net 5 DateTime.ParseExact problems

刚刚迁移到 .Net 5。
“日期”变量中的下一个代码 returns“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 中,您可能已经看到了这一点。你会得到一个异常告诉你:

String 'Июн 16 2021' was not recognized as a valid DateTime.

这可以为您指明正确的方向。

这是 .NET 5 中的重大更改,其中 Globalization APIs use ICU libraries on Windows. To keep the old behaviour, 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_USENLStrue1.