我很困惑。已读入这个答案 https://stackoverflow.com/a/13391774/16607977我们应该依赖内置本地化,我对以下观察结果感到惊讶:
当我跑步时
using System;
using System.Globalization;
public class Program
{
public static void Main()
{
Console.WriteLine(DateTime.Now.ToString("hh tt", new CultureInfo("de")));
}
}
根据框架和/或编译器,我得到的结果非常不同。示例基于 10:00 UTC(上午 10 点)。
- 运行它尝试 dotnet https://dotnet.microsoft.com/platform/try-dotnet I get:
10 vorm.
- 运行它点网小提琴 https://dotnetfiddle.net/将“编译器”设置为 .NET 5 我得到相同的结果:
10 vorm.
现在有趣的部分:
- 运行它点网小提琴 https://dotnetfiddle.net/将“编译器”设置为 .NET 4.7.2 我得到:
10
- 运行它点网小提琴 https://dotnetfiddle.net/将“编译器”设置为Roslyn I get:
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")));
这些是结果 - 添加了 try-dotnet 进行比较。
Culture |
.NET 5 |
.NET Core 3.1 |
.NET Core 2.0 |
.NET Framework 4.8 |
Mono |
try-dotnet |
"de" |
10 AM |
10 |
10 |
10 |
10 vorm. |
10 vorm. |
"de-DE" |
10 |
10 |
10 |
10 |
10 vorm. |
10 vorm. |
"fr" |
10 AM |
10 |
10 |
10 |
10 AM |
10 AM |
在 Mono 列中,结果来自使用 Mono 编译文件(Mono JIT 编译器版本 6.4.0),然后用 mono 运行它。在没有 Mono 的情况下运行 .exe 会产生与第三列相同的结果。
这是从哪里来的,是编译器还是框架中的错误?它只是坏了还是故意设计的?
这一重大变化是由于在 Windows 上使用 ICU 库而不是 NLS 库 https://learn.microsoft.com/en-us/dotnet/core/compatibility/globalization/5.0/icu-globalization-api.
您可以在 .net 5.0 应用程序中验证这一点,方法是将以下内容添加到项目中,以从使用 ICU 库恢复为使用 NLS 库:
<ItemGroup>
<RuntimeHostConfigurationOption Include="System.Globalization.UseNls" Value="true" />
</ItemGroup>
使用代码将其添加到我的测试 .Net 5.0 控制台应用程序后
Console.WriteLine(DateTime.Now.ToString("hh tt", new CultureInfo("de")));
输出变化自11 AM
to 11
(在撰写本文时)。
请参阅此处了解更多详情 https://learn.microsoft.com/en-us/dotnet/core/extensions/globalization-icu.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)