bad*_*sta 6 .net c# datetime .net-core .net-5
我很困惑。在读到我们应该依赖内置本地化的答案后,我对以下观察结果感到惊讶:
当我跑步时
using System;
using System.Globalization;
public class Program
{
public static void Main()
{
Console.WriteLine(DateTime.Now.ToString("hh tt", new CultureInfo("de")));
}
}
Run Code Online (Sandbox Code Playgroud)
根据框架和/或编译器,我得到的结果非常不同。示例基于 10:00 UTC(上午 10 点)。
10 vorm.10 vorm.现在有趣的部分:
10 10 它变得更奇怪:我已经使用控制台应用程序在本地进行了尝试,并将示例扩展为
Console.WriteLine(DateTime.Now.ToString("hh tt", new CultureInfo("de")));
Console.WriteLine(DateTime.Now.ToString("hh tt", new CultureInfo("de-DE")));
Console.WriteLine(DateTime.Now.ToString("hh tt", new CultureInfo("fr")));
Run Code Online (Sandbox Code Playgroud)
这些是结果 - 添加了 try-dotnet 进行比较。
| 文化 | .NET 5 | .NET核心3.1 | .NET核心2.0 | .NET框架4.8 | 单核细胞增多症 | 尝试 dotnet |
|---|---|---|---|---|---|---|
| “德” | 上午 10 点 | 10 | 10 | 10 | 10 蠕虫。 | 10 蠕虫。 |
| “de-DE” | 10 | 10 | 10 | 10 | 10 蠕虫。 | 10 蠕虫。 |
| “fr” | 上午 10 点 | 10 | 10 | 10 | 上午 10 点 | 上午 10 点 |
在 Mono 列中,结果来自使用 Mono(Mono JIT 编译器版本 6.4.0)编译文件,然后使用 mono 运行它。在没有 Mono 的情况下运行 .exe 会产生与第三列相同的结果。
这是从哪里来的,是编译器还是框架中的错误?它只是坏了还是故意设计的?
这一重大更改是由于使用 Windows 上的 ICU 库而不是 NLS 库造成的。
您可以在 .net 5.0 应用程序中验证这一点,方法是将以下内容添加到项目中,以从使用 ICU 库恢复为使用 NLS 库:
<ItemGroup>
<RuntimeHostConfigurationOption Include="System.Globalization.UseNls" Value="true" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
使用代码将其添加到我的测试 .Net 5.0 控制台应用程序后
Console.WriteLine(DateTime.Now.ToString("hh tt", new CultureInfo("de")));
Run Code Online (Sandbox Code Playgroud)
输出从 变为11 AM(11在撰写本文时)。