Что определяет форматы даты .NET в программе C #? - PullRequest
1 голос
/ 16 сентября 2010

Я сделал простой веб-сервис, который хорошо работал с несколькими системами, которые были развернуты. Теперь дата из Oracle вызывает проблемы на другой системе.

Некоторая информация:

Наши собственные методы, которые обращаются к oracle, возвращают даты в виде строки в формате 15.09.2010 13:15:00 (отметьте год четырьмя цифрами)

System working:
-DateTime.ToSring() produces 16.09.10 14:15:49 (used in log-file, note year in 2 digits)
-TryParse(string s, out DateTime result); returns true with string 15.09.2010 13:15:00
-System.Globalization.CultureInfo.CurrentUICulture.Name has value "en-US"

System NOT working:
-DateTime.ToSring() produces 9/16/2010 1:25:51 PM  (used in log file)
-TryParse(string s, out DateTime result); returns false with string 15.09.2010 13:15:00
-System.Globalization.CultureInfo.CurrentUICulture.Name has value "en-US"

Итак, мои вопросы:

  1. Чем отличаются эти 2 системы?
  2. Каков наилучший способ сделать этот код универсальным (я знаю, что могу использовать форматер для DateTime.TryParse и DateTime.ToString ())

Ответы [ 4 ]

3 голосов
/ 16 сентября 2010

Скорее всего, форматы даты и времени на двух компьютерах настроены по-разному (в Панель управления -> Региональные и языковые параметры -> Форматы ).

Если вы хотите сделать этот код универсальным, вам следует указать явный формат при использовании ToString, TryParse и любых других методов, которые преобразуют DateTime в / из текста; и используйте UTC . Ваша самая безопасная ставка, вероятно, будет в одном из форматов ISO-8601 ; например yyyy-MM-ddTHH:mm:ssZ.

1 голос
/ 16 сентября 2010

Наши собственные методы, которые обращаются к oracle, возвращают даты в виде строки в формате

Это кажется мне главной проблемой.Почему вы конвертируете значения в строки для начала?Используйте параметризованные запросы и т. Д., И вам вообще не нужно иметь дело со строковыми значениями.Просто верните DateTime или DateTimeOffset.

Вы можете убедиться, что вы всегда анализируете / форматируете с очень специфической строкой формата и культурой ... но лучше избегать выполненияконверсия на первом месте.

0 голосов
/ 16 сентября 2010

Это зависит.

  • Для форматирования это определяется текущей локалью потока.Точка.

  • Это обычно получает pre-initializd с языком пользователя, запускающего приложение.

  • Я думаю, что для сети, это определеноБРАУЗЕР, передавая языки, которые он хочет.Тем не менее, это неуверенно - также может зависеть от настройки в web.config.

В любом случае, если вы хотите УКАЗАТЬ конкретное форматирование, то СПРОСИТЕ ЭТО.CultureInfo.InvariantCulture и т. Д. Могут передаваться во все функции форматирования и, в крайнем случае, текущая культура потока также может быть изменена.

0 голосов
/ 16 сентября 2010

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

DateTime.Ticks предоставит вам длинное значение, которое вы можете сохранить как Int64 или распечатать в текстовом файле.Если вы все еще хотите посмотреть текстовый файл и понять, сколько времени вы можете напечатать, оба.

Тики универсальны и будут работать при любых условиях и сопоставлениях.

...