【问题标题】:Changing DateSeparator doesn't work for all CultureInfos更改 DateSeparator 不适用于所有 CultureInfos
【发布时间】:2020-08-03 13:17:29
【问题描述】:

我正在尝试更改 DateSeparator,但它不适用于所有文化。下面,我尝试在日韩文化中格式化日期,并使用下划线作为日期分隔符。它适用于日本,但不适用于韩国。我发现其他一些文化也有这种行为。

CultureInfo jpCulture = CultureInfo.CreateSpecificCulture("jp");
DateTimeFormatInfo jpFormat = jpCulture.DateTimeFormat;
jpFormat.DateSeparator = "_";

CultureInfo koCulture = CultureInfo.CreateSpecificCulture("ko");
DateTimeFormatInfo koFormat = koCulture.DateTimeFormat;
koFormat.DateSeparator = "_";

string jpDate = DateTime.Now.ToString("d", jpFormat);
string koDate = DateTime.Now.ToString("d", koFormat);

System.Console.WriteLine($"My local (US) formatting: {DateTime.Now:d} - JP Formatter: {jpDate} - KO Formatter: {koDate}");

将输出:

My local (US) formatting: 8/3/2020 - JP Formatter: 08_03_2020 - KO Formatter: 2020-08-03

我原以为韩文格式的字符串也会使用下划线。

我的目标是始终使用适合文化(YMD、MDY 或 DMY)但使用可自定义分隔符的日期格式。有没有更合适的方法来做到这一点?

【问题讨论】:

    标签: c# localization


    【解决方案1】:

    这是因为d 标准日期/时间格式说明符使用DateTimeFormat.ShortDatePattern 来生成输出字符串。只有模式中的"/" 字符会被区域设置的DateSeparator 替换。

    如果您将以下内容添加到您的测试应用程序中:

    Console.WriteLine(koCulture.DateTimeFormat.ShortDatePattern);
    Console.WriteLine(jpCulture.DateTimeFormat.ShortDatePattern);
    

    您将看到以下输出:

    yyyy-MM-dd
    MM/dd/yyyy
    

    日文字符串包含将被DateTimeFormat.DateSeparator 替换的“/”字符,这样就可以了。

    然而,韩国人使用- - 不会被替换!

    一种可能的解决方法是像这样更改韩语短日期格式:

    koCulture.DateTimeFormat.ShortDatePattern = koCulture.DateTimeFormat.ShortDatePattern.Replace('-', '/');
    

    (虽然这对我来说有点片面......)

    至于为什么韩国短日期模式是这样设置的,我不知道。这似乎是一个错误,但只有 Microsoft 可以回答!

    看起来很多文化具有“不正确的”ShortDatePattern 值,Microsoft 已将实际日期分隔符而不是 "/" 字符放入其中,如以下代码所示:

    foreach (var culture in CultureInfo.GetCultures(CultureTypes.AllCultures))
    {
        var dtf = culture.DateTimeFormat;
    
        if (dtf.DateSeparator != "/" && dtf.ShortDatePattern.Contains(dtf.DateSeparator))
            Console.WriteLine(culture.EnglishName + " has incorrect short date pattern: " + dtf.ShortDatePattern);
    }
    

    【讨论】:

    • 俄罗斯日期格式使用 . 作为日期分隔符,这似乎是 MS 的疏忽(针对不同文化的单元测试?为什么要麻烦?)
    【解决方案2】:

    DateSeparator有问题,只有/被替换成指定的分隔符,这个可以看source

    对于ShortDatePattern 包含除/ 以外的其他分隔符的任何文化,DateSeparator 不起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-01
      • 2017-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多