更改 DateSeparator 不适用于所有 CultureInfos

Changing DateSeparator doesn't work for all CultureInfos

我正在尝试更改 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)但使用可自定义分隔符的日期格式。有更合适的方法吗?

这是因为 d 标准 date/time 格式说明符使用 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('-', '/');

(虽然这对我来说有点不稳定...)

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

看起来很多文化都有“不正确的”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);
}

DateSeparator, only / is replaced with specified separator, this can be seen in source 有问题。

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