Мой компьютер настроен на культуру, которая не en-US
.
При использовании родной функции Win32 GetDateFormat
я получаю правильно отформатированные даты:
Это правильно; и это также то, как Windows отображает это:
панель задач
настройки региона и языка
Windows Explorer
Outlook
Когда я пытаюсь преобразовать дату в строку в . NET, используя мою текущую локаль, например:
DateTime.Now.ToString();
DateTime.Now.ToString(CultureInfo.CurrentCulture);
я получаю неправильную дату:
Эта ошибка в .NET проявляется в любом месте в Windows, где используется ошибочный .NET код:
Windows Event Viewer:
Task Scheduler:
SQL Server Management Studio:
Как сделать .NET не глючным?
Как преобразовать даты и время в строки, используя текущую культуру (правильно)?
Примечание: Пользователь может установить свою Windows на любую локаль, которую он захочет. В нынешнем виде моя программа не будет обрабатывать. действительные настройки должным образом. Говорить пользователю: "Не делай этого" - довольно подло.
Похожий пример можно привести из Delphi, которая предполагает, что разделитель даты никогда не может быть больше одного символа. Когда Windows настроена локаль, которая использует несколько символов для разделителя даты разделитель, например:
- sk-SK (Slovak - Словакия) :
.
где даты должны быть отформатированы как:
22. 11. 2011
библиотека кода не может принять разделитель даты длиннее одного и возвращается к:
22/11/2011
В прошлом некоторые могли предложить вам не беспокоиться о таких крайних случаях. случаи. Такие предложения не имеют для меня никакого веса.
Я не буду вступать в перепалку с тем, кто хочет изменить смысл моего вопроса, изменив название. Но вопрос не ограничивается псевдолокальными шкалами, специально разработанными для поиска ошибок в приложениях.
Вот уникальный список форматов дат со всего мира:
Особый интерес представляет последний пример, в котором не используется григорианский календарь:
ar-SA
: 29/12/32 02:03:07 مdv-MV
: 29/12/32 14:03:07prf-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".