C # DateTime.ToString () неправильно в Linux Ubuntu 18.04, хотя в текущем потоке установлена ​​правильная локаль - PullRequest
2 голосов
/ 09 мая 2019

Хорошо, это сводит меня с ума. Я установил новый экземпляр сервера Ubuntu 18.04, на котором запущено мое приложение dotnetcore 2.2 mvc.

Хотя локаль, кажется, правильно установлена ​​в ОС и в текущем потоке, функции DateTime.ToString () дают мне странный формат данных:

  • Неправильный формат: 19-05-09 12 12 21 21 02 2
  • Ожидаемый формат: 19-05-09 12: 21: 01

В обоих случаях текущим локальным потоком является "fr-CA". В ОС команда «locale» возвращает мне «en_US» в обоих случаях.

Я проверил depper в CurrentThread.CurrentCulture.DateTimeFormat, и в обоих случаях он не одинаков. При просмотре переменной CurrentThread.CurrentCulture.DateTimeFormat.ShortTimePattern:

  • Неправильный формат вывода шаблонов дает мне: ЧЧ ч мм
  • Шаблон вывода с хорошим форматом сервера дает мне: ЧЧ: мм

Что это за колдовство? Мой нос кровоточит.

Ответы [ 4 ]

2 голосов
/ 09 мая 2019

Я могу воспроизвести ваши результаты, и, похоже, это конкретная ошибка, связанная с тем, как .NET Core интерпретирует данные CLDR для этой конкретной культуры.

Я сообщил о проблеме здесь: https://github.com/dotnet/corefx/issues/37557

1 голос
/ 09 мая 2019

Посмотрев на исходный код формата DateTime в ядре dotnet, я пришел к исправлению, чтобы обеспечить правильную работу ToString () без параметров.

System.Threading.Thread.CurrentThread.CurrentUICulture.DateTimeFormat.LongTimePattern = "HH:mm:ss";
System.Threading.Thread.CurrentThread.CurrentUICulture.DateTimeFormat.ShortDatePattern = "yyyy-MM-dd";            
System.Threading.Thread.CurrentThread.CurrentUICulture.DateTimeFormat.TimeSeparator = ":";

System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat = System.Threading.Thread.CurrentThread.CurrentUICulture.DateTimeFormat;
0 голосов
/ 16 мая 2019

Исправление этой проблемы будет в .NET Core 3.0.

Если вы хотите обойти эту проблему, не затрагивая каждый вызов DateTime.ToString, вы можете попробовать сделать что-то вроде:

CultureInfo.CurrentCulture.DateTimeFormat.LongTimePattern = "ЧЧ 'ч' мм 'мин' сс 'с'";CultureInfo.CurrentCulture.DateTimeFormat.ShortTimePattern = "HH 'h' mm";// или выберите любой формат, который вы предпочитаете

0 голосов
/ 09 мая 2019

Как сказал @Powerlord в комментарии, почему бы вам не указать формат вашей даты?

Примерно так:

DateTime.ToString("dd-MM-yy HH:mm:ss");

Выход:

09-05-19 17:43:10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...