微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

.Net 5 DateTime.ParseExact 问题

如何解决.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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。