Это означает, что вы пытаетесь манипулировать тем, что имеет ссылку, но еще не инициализировано. Первое, что нужно сделать, это проверить каждый созданный экземпляр. Используйте контрольные точки, часы, проверяйте свои значения varibale. Следить за трассировкой стека и искать точные строки и столбцы, которые создают проблему
Вы должны указать, какую культуру вы хотите использовать всякий раз, когда вы конвертируете строку в дату.
Культура, которую вы должны использовать, зависит от того, в какой культуре отформатированы даты. Например, если все даты, которые вы обрабатываете, отформатированы как словацкий:
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
Никогда, никогда, хранить даты внутри себя как строки. Не в базе данных, а не в вашем приложении.
Если вам нужно переместить значения даты между серверами, перейдите в двоичный файл. Или, если вам действительно нужно использовать строки, используйте ToString(CultureInfo.InvariantCulture)
или просто сериализуйте свойство Ticks
.
Кроме того, никогда не передавайте даты в виде строк в базу данных с помощью SQL-команд, которые вы создаете с использованием кода. Используйте SqlParameter
для этого или даже лучше, полагайтесь на некоторый O / R Mapper, такой как Entity Framework или Linq to SQL.
Если вы развернуты на сервере, который не находится под вашим контролем, жизненно важно убедиться, что ваш код не имеет жестко закодированных зависимостей от культуры.
Скорее всего, вы захотите выполнить поиск кода для DateTime.Parse или аналогичного. У нас есть набор методов расширения на DateTime
, которые мы используем вместо этого, чтобы заставить правильную культуру.
Никогда не зависит от локали сервера по умолчанию. Для вашего случая это означает:
to_date
и to_char
везде (точные имена зависят от вашей СУБД), если вы действительно должны использовать строковые объекты в вашем приложении