Изменение DateSeparator работает не для всех CultureInfos - PullRequest
2 голосов
/ 03 августа 2020

Я пытаюсь изменить 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), но с использованием настраиваемого разделителя. Есть ли более подходящий способ сделать это?

Ответы [ 2 ]

1 голос
/ 03 августа 2020

Это происходит потому, что спецификатор стандартного формата даты / времени 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);
}
0 голосов
/ 03 августа 2020

Возникла проблема с DateSeparator , только / заменяется указанным разделителем, это можно увидеть в source .

Для любой культуры с ShortDatePattern, содержащий разделитель, отличный от /, DateSeparator не работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...