Мой компьютер настроен на культуру , а не en-US
.
При использовании встроенной функции Win32 GetDateFormat
я получаю правильно отформатированные даты:
- 22 // 11 // 2011 4 :: 42 :: 53 P̰̃M]
Это правильно; а также как Windows отображает это:
Когда я пытаюсь преобразовать дату в строку в .NET, используя мою текущую локаль, например ::
DateTime.Now.ToString();
DateTime.Now.ToString(CultureInfo.CurrentCulture);
у меня неверная дата:
- 22 //// 11 //// 2011 4 :::: 42 :::: 53 P̰̃M]
Эта ошибка в .NET очевидна везде в Windows, где используется ошибка
.NET код:
Как сделать так, чтобы .NET не глючил?
Как преобразовать даты и время в строки, используя текущую культуру (правильно)?
Примечание : пользователю разрешено установить их Windows для любых региональных настроек они хотят. Как и сейчас, моя программа не справится
действительные настройки правильно. Говорить пользователю «Не делай этого» довольно подло.
Аналогичный пример взят из Delphi, который предполагает, что дата
разделитель никогда не может содержать более одного символа. Когда Windows
настроен с языком, который использует несколько символов для даты
разделитель, например ::1100*
- sk-SK (Словакия - Словакия):
.
где даты должны быть отформатированы как:
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
-
-
- 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 غ.و
Хотя это крайние случаи, о которых вам никогда не придется беспокоиться.
Обновление 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"
.Parse
вызывает исключение.
Обновление 02 // 8, 2012 09 :: 56'12:
Любое использование разделителя даты ограничено, в дополнение к неправильному. Из MSDN:
Windows Vista и более поздние версии: Эта константа устарела.Вместо этого используйте LOCALE_SSHORTDATE
.У пользовательской локали может не быть единого, одинакового символа разделителя.Например, допустим формат «12/31, 2006».
Windows Vista и более поздние версии: Эта константаосуждается.Используйте LOCALE_STIMEFORMAT
вместо этого.У пользовательской локали может не быть единого, одинакового символа разделителя.Например, допустим формат «03: 56'23».