Спецификатор формата краткой даты («d») не печатает год с 4 цифрами в .NET Core на MacOS - PullRequest
1 голос
/ 03 июля 2019

Я хочу распечатать дату с 4-значным годом. Это должно быть очень просто, согласно документам MS. Но

    static void Main(string[] args)
    {
        var sample = new DateTime(2050, 1, 1);
        var datestr = sample.ToString("d", CultureInfo.GetCultureInfo("de"));
        Console.WriteLine(datestr);
    }

печатает 01.01.50 вместо 01.01.2050. Зачем? Это .Net Core 2.1 на Mac. Смотри также https://dotnetfiddle.net/4ZSbOJ

Ответы [ 2 ]

3 голосов
/ 03 июля 2019

Ответ с учетом того, что это происходит в MacOS

Немного покопавшись в исходном коде, кажется, что в Linux / MacOS .NET Core будет использовать ICU для форматирования даты и времени, и в вашем случае это приведет к двузначному году. Существует проблема , решенная с помощью запроса на извлечение для обеспечения согласованности форматирования года на разных платформах. Однако, насколько я вижу, это изменение планируется включить только в .NET Core 3.


Неправильный ответ, предполагая, что ОС Windows

Выполнение следующего кода

var sample = new DateTime(2050, 1, 1);
var datestr = sample.ToString("d", CultureInfo.GetCultureInfo("de"));
Console.WriteLine(datestr);

печать

01.01.2050

так что, похоже, проблема специфична для вас.

Однако, хотя вы указали, что ваша культура "de_DE", ваш код не использует культуру. Если в вызове ToString не указана культура, используется CultureInfo.CurrentCulture, поэтому я предполагаю, что вы настроили Windows для использования немецкого регионального формата.

Windows позволяет вам настроить региональный формат, и если вы это сделаете, .NET будет использовать ваш измененный формат при использовании CultureInfo.CurrentCulture. Вы можете проверить и изменить формат в приложении «Настройки Windows»:

  • Настройки (клавиша Windows + I)
  • Время и язык
  • Регион
  • Изменить форматы данных

Вы можете найти это удивительным, и есть еще более удивительный факт о культуре, возвращенной CultureInfo.CreateSpecificCulture, о которой вы можете прочитать в моем ответе на вопрос Когда использовать CultureInfo.GetCultureInfo (String) или CultureInfo. CreateSpecificCulture (String) .

Чтобы избежать этой функции (или причуды) CultureInfo.CurrentCulture, вы можете явно указать CultureInfo при форматировании даты. Однако, если эта дата отображается для пользователя, то, вероятно, лучше просто использовать CultureInfo.CurrentCulture, чтобы позволить пользователю свободно настраивать формат.

1 голос
/ 03 июля 2019

Вы правы. .NET Core 2.2 отображает дату иначе, чем .NET 4.7.2. Сейчас вы можете использовать

var datestr = sample.ToString("dd.MM.yyyy", CultureInfo.GetCultureInfo("de-DE"));

Пока мы не узнаем, что происходит, это либо ошибка, либо функция. Просто подтвердите день и месяц заказа.

Просто посмотрите на формат с .Net Core , и результат не совпадает с .Net Core 2.2.

d Format Specifier      de-DE Culture                                 01.10.08
d Format Specifier      en-US Culture                                  10/1/08
d Format Specifier      es-ES Culture                                  1/10/08
d Format Specifier      fr-FR Culture                               01/10/2008

Ожидаемое

d Format Specifier      de-DE Culture                               01.10.2008
d Format Specifier      en-US Culture                                10/1/2008
d Format Specifier      es-ES Culture                               01/10/2008
d Format Specifier      fr-FR Culture                               01/10/2008

Это проблема

var sample1 = new DateTime(2013, 1, 1);
var sample2 = new DateTime(1913, 1, 1);

Оказывает тот же вывод

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