.NET Date to string дает недопустимые строки в Vista Псевдокультуры

Мой компьютер настроен на культуру, которая не en-US.

При использовании родной функции Win32 GetDateFormat я получаю правильно отформатированные даты:

  • 22//11//2011 4::42::53 P̰̃M]

Это правильно; и это также то, как Windows отображает это:

  • панель задач

    enter image description here

  • настройки региона и языка

    enter image description here

  • Windows Explorer

    enter image description here

  • Outlook

    enter image description here

Когда я пытаюсь преобразовать дату в строку в . NET, используя мою текущую локаль, например:

DateTime.Now.ToString();
DateTime.Now.ToString(CultureInfo.CurrentCulture);

я получаю неправильную дату:

  • 22////11////2011 4::::42::::53 P̰̃M]

Эта ошибка в .NET проявляется в любом месте в Windows, где используется ошибочный .NET код:

  • Windows Event Viewer:

    enter image description here

  • Task Scheduler:

    enter image description here

  • SQL Server Management Studio:

    enter image description here

Как сделать .NET не глючным?

Как преобразовать даты и время в строки, используя текущую культуру (правильно)?

Примечание: Пользователь может установить свою Windows на любую локаль, которую он захочет. В нынешнем виде моя программа не будет обрабатывать. действительные настройки должным образом. Говорить пользователю: "Не делай этого" - довольно подло.

Похожий пример можно привести из Delphi, которая предполагает, что разделитель даты никогда не может быть больше одного символа. Когда Windows настроена локаль, которая использует несколько символов для разделителя даты разделитель, например:

  • sk-SK (Slovak - Словакия) : .

где даты должны быть отформатированы как:

22. 11. 2011

библиотека кода не может принять разделитель даты длиннее одного и возвращается к:

22/11/2011

В прошлом некоторые могли предложить вам не беспокоиться о таких крайних случаях. случаи. Такие предложения не имеют для меня никакого веса.

Я не буду вступать в перепалку с тем, кто хочет изменить смысл моего вопроса, изменив название. Но вопрос не ограничивается псевдолокальными шкалами, специально разработанными для поиска ошибок в приложениях.

Бонусная болтовня

Вот уникальный список форматов дат со всего мира:

  • 11.11.25
  • 11.25.2011
  • 11/25/2011
  • 2011.11.25
  • 2011.11.25.
  • 2011/11/25
  • 2011-11-25
      1. 2011
  • 25.11.11
  • 25.11.2011
  • 25.11.2011 г.
  • 25.11.2011.
  • 25//11//2011
  • 25/11 2011
  • 25/11/2011
  • 25/11/2554
  • 25-11-11
  • 25-11-2011
  • 29/12/32

Особый интерес представляет последний пример, в котором не используется григорианский календарь:

  • арабский (Саудовская Аравия) ar-SA: 29/12/32 02:03:07 م
  • дивехи (Мальдивы) dv-MV: 29/12/32 14:03:07
  • дари/пушту (Афганистан) prf-AF / ps-AF: 29/12/32 2:03:07 غ. و

Хотя это крайние случаи, о которых вам никогда не придется беспокоиться.


Update 14//12//2011:

Еще одна демонстрация ошибки - Datetime.Parse не может разобрать DateTime.ToString:

String s = DateTime.Today.ToString("d");   //returns "14////12////2011"
DateTime d = DateTime.Parse(s);            //expects "dd//MM//yyyy"

The .Parse бросает исключение.


Обновление 02//8, 2012 09::56'12:

Любое использование разделителя даты является не только некорректным, но и недопустимым. Из MSDN:

LOCALE_SDATE

Windows Vista и более поздние версии: Эта константа устарела. Use LOCALE_SSHORTDATE instead. Пользовательская локаль может не иметь единого, унифицированного символа-разделителя. Например, допустим формат "12/31, 2006".

LOCALE_STIME

Windows Vista и более поздние версии: Эта константа устарела. Вместо нее используйте LOCALE_STIMEFORMAT. Пользовательская локаль может не иметь единого, унифицированного символа-разделителя. Например, действителен такой формат, как "03:56'23".

22
задан Community 23 May 2017 в 12:07
поделиться