У меня есть объект со следующим свойством:
[ScriptIgnore]
public DateTime Date
{
get { return new DateTime(this.Ticks); }
set { this.Ticks = value.Ticks; }
}
Он задает поле Ticks, которое определяет, как DateTime хранится в базе данных.
Проблема в том, что я вижуXML входит с полем Date, отформатированным следующим образом:
<Date>2011-04-08T12:29:00.000Z</Date>
, которое является прекрасным строковым представлением DateTime.И при тестировании эта строка анализирует DateTime, который вы ожидаете.
Но в системе устанавливается дата 2011-04-10 12:29, или ровно через два дня в будущем.
Это происходит непоследовательно и непредсказуемо.Я могу сделать сотни заявлений, и все они верны.Но когда клиент отправляет их в ранние утренние часы, несколько из них заканчивают с датами два дня в будущем.Это приводит меня к нескольким, в настоящее время не подлежащим рассмотрению, вопросам:
Какой метод конструктора или синтаксического анализа используется, когда XML десериализуется в DateTime?
Клиент находится в центральном времени, наш сервер - по восточному времени (хотя все времена всегда конвертированы в GMT), это как-то влияет?
Что подсказывает тот факт, чтобольшинство ошибок происходят в ранние утренние часы, но не могут быть воспроизведены остальную часть дня, дайте мне, или это просто странное совпадение?
ОБНОВЛЕНИЕ:
После прочтения следующего сообщения в блоге: http://blogs.msdn.com/b/bclteam/archive/2005/03/07/387677.aspx Похоже, что .net DateTime действительно имеет проблемы с десериализацией.И он действительно использует время локального сервера, даже когда не должен.Это не объясняет ВСЕ мои проблемы, но приводит к решению прекратить использование типа DateTime в службах XML, и вместо этого клиент должен вместо этого отправлять datetime в виде тиков.Пока .Net не дает сбой при разборе длинных, у нас должно быть все в порядке.
ОБНОВЛЕНИЕ 2:
Клиент был против отправки datetime в виде тиков, так как каждыйОС имеет другое определение того, что такое Ticks (клиент на Java, не знаю, какая ОС). Поэтому мы решили использовать строки.Клиент вообще не изменил свой отправленный XML, но мы могли бы вручную проанализировать строку до даты вместо того, чтобы позволить десериализатору сделать это.
Я обновил свойство следующим образом:
[ScriptIgnore]
public string Date
{
get { return new DateTime(this.Ticks).ToString(); }
set
{
if (string.IsNullOrEmpty(value))
{
this.Ticks = 0;
}
else
{
this.Ticks = DateTime.Parse(value).ToUniversalTime().Ticks;
}
}
}
И проблема все еще существует, в 1:00 утра этим утром клиент импортировал приблизительно 20 записей, и только 2 из них таинственным образом перенесли дату.Посмотрев на исходный XML как успешно проанализированной даты, так и тех, которые не были проанализированы, я не вижу никакой разницы в формате.
Любая помощь в этой точке очень ценится.