【问题标题】:.Net 5 DateTime.ParseExact problems.Net 5 DateTime.ParseExact 问题
【发布时间】:2021-06-17 18:49:55
【问题描述】:

刚刚在 .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 上没有问题。

有人遇到过同样的问题吗?

【问题讨论】:

  • 尝试打印出所有月份的名称。有时他们会“修复”这些问题。
  • docs.microsoft.com/en-us/dotnet/api/…TryParseExact 失败很可能是由于在 .NET Core 3.1 和 .NET 5 上处理 CultureInfo 的方式不同。
  • 这是意料之中的,因为DateTime.TryParseExact 返回false,这意味着操作没有成功。如果您期待Exception,则需要使用DateTime.ParseExact 方法(无需尝试)。 Try 表示根据成功返回真/假,不抛出异常。
  • 将文本更改为“июнь 16 2021”时有效
  • @PMF,感谢您的好建议)

标签: c# .net .net-core .net-5 datetime-parsing


【解决方案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' 未被识别为有效的日期时间。

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

【讨论】:

  • 非常感谢! )
【解决方案2】:

这是 .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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    相关资源
    最近更新 更多