почему формат даты по умолчанию отличается от службы Windows и winform? [Дубликат]

Это означает, что вы пытаетесь манипулировать тем, что имеет ссылку, но еще не инициализировано. Первое, что нужно сделать, это проверить каждый созданный экземпляр. Используйте контрольные точки, часы, проверяйте свои значения varibale. Следить за трассировкой стека и искать точные строки и столбцы, которые создают проблему

7
задан Sai Kalyan Kumar Akshinthala 24 October 2011 в 12:25
поделиться

4 ответа

Вы должны указать, какую культуру вы хотите использовать всякий раз, когда вы конвертируете строку в дату.

Культура, которую вы должны использовать, зависит от того, в какой культуре отформатированы даты. Например, если все даты, которые вы обрабатываете, отформатированы как словацкий:

String s = "24. 10. 2011";

Затем вам нужно проанализировать строку так, как если бы она была в словацкой (Словакии) (sk-SK) культуре:

//Bad:
d = DateTime.Parse(s);

//Good:
d = DateTime.Parse(s, CultureInfo.CreateSpecificCulture("sk-SK")); //Slovak (Slovakia)

Если ваши даты написаны на таджикском (киргизский язык в Таджикистане), вам необходимо проанализировать его как tg-Cryl-Tj:

String s = "24.10.11"

DateTime d = DateTime.Parse(s, CultureInfo.CreateSpecificCulture("tg-Cryl-Tj"));

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

//Bad
String s = d.ToString();

//Good
String s = d.ToString(CultureInfo.CreateSpecificCulture("si-LK")); //Sinhala (Sri Lanka)

//s = "2011-10-24 12:00:00 පෙ.ව."

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

  • en-AU (English Austrailia): 24/10/2011
  • en-IA (English India): 24-10-2011
  • en-ZA (английский язык в Южной Африке): 2011/10/24
  • en-US (English): 10/24/2011

i Предположим, вы предпочитаете английский (Индия) (en-IA).


Но если вы действительно не можете решить, какую культуру использовать при преобразовании дат в строки и наоборот, а даты никогда не будут чтобы показать пользователю, тогда вы можете использовать Инвариантную Культуру:

String s = "10/24/2011" //invariant culture formatted date

d = DateTime.Parse(s, CultureInfo.InvariantCulture); //parse invariant culture date

s = d.ToString(CultureInfo.InvariantCulture); //convert to invariant culture string
11
ответ дан Ian Boyd 23 August 2018 в 17:57
поделиться

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

Если вам нужно переместить значения даты между серверами, перейдите в двоичный файл. Или, если вам действительно нужно использовать строки, используйте ToString(CultureInfo.InvariantCulture) или просто сериализуйте свойство Ticks.

Кроме того, никогда не передавайте даты в виде строк в базу данных с помощью SQL-команд, которые вы создаете с использованием кода. Используйте SqlParameter для этого или даже лучше, полагайтесь на некоторый O / R Mapper, такой как Entity Framework или Linq to SQL.

1
ответ дан Anders Tornblad 23 August 2018 в 17:57
поделиться

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

Скорее всего, вы захотите выполнить поиск кода для DateTime.Parse или аналогичного. У нас есть набор методов расширения на DateTime, которые мы используем вместо этого, чтобы заставить правильную культуру.

0
ответ дан Jeremy McGee 23 August 2018 в 17:57
поделиться

Никогда не зависит от локали сервера по умолчанию. Для вашего случая это означает:

  • Использовать подготовленные операторы, в которых вы передаете дату как (неформатированный) объект даты, а не как (форматированный) строковый объект. В любом случае вы никогда не должны использовать строки для представления дат в своем приложении, так как вы не можете выполнять на них определенные по дате функции (например, добавление 1 месяца, получение последнего дня текущей недели и т. Д.).
  • Использовать SQL функции, такие как to_date и to_char везде (точные имена зависят от вашей СУБД), если вы действительно должны использовать строковые объекты в вашем приложении
0
ответ дан michael667 23 August 2018 в 17:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: