c# - 为什么 "DateTime.Now.ToString("hh tt", new CultureInfo ("de"))"在不同版本的 .Net 中返回不同的结果?

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

我很困惑。已阅读 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 点)。
  • try-dotnet 上运行它我得到:10 vorm.
  • dotnetfiddle 上运行它将“编译器”设置为 .NET 5 我得到相同的结果:10 vorm.

  • 现在有趣的部分:
  • dotnetfiddle 上运行它将“编译器”设置为 .NET 4.7.2 我得到:10
  • dotnetfiddle 上运行它将“编译器”设置为 Roslyn 我得到: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/

    相关文章:

    c# - 将数组插入 MongoDB 的子集合中会省略 _t 鉴别器

    c# - 如何访问从 Powershell 的 .NET 事件返回的对象参数

    c# - 使用不同的 publicKeyToken 升级引用 .Net dll

    r - 从 R 中的给定字符串中提取日期

    javascript - 如何弄清楚如何通过此 jQuery 脚本正确使用 setInterval

    c# - 在 C# 中解析 jQuery 序列化数据

    c# - ASP.NET Core MVC Hangfire 自定义身份验证

    c# - 为什么 C# 允许在集合初始值设定项中使用尾随逗号,但不允许在参数中使用?

    c# - 在特定时间运行 Windows 服务

    c# - 无法更改以 "/"作为分隔符的日期格式,如果默认系统日期格式以 "-"作为日期分隔符