我很困惑。已阅读 this answer我们应该依赖内置的本地化,我对以下观察感到惊讶:
当我跑
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 点)。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")));
这些是结果 - 添加了 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 会产生与第三列相同的结果。
这是从哪里来的,是编译器或框架中的错误?它只是坏了还是设计使然?
最佳答案
此重大更改是 the use of the ICU Libraries on Windows instead of the NLS Libraries 的结果.
您可以在 .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
改变至 11
(在撰写本文时)。See here for more details .
关于c# - 为什么 "DateTime.Now.ToString("hh tt", new CultureInfo ("de"))"在不同版本的 .Net 中返回不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69345101/