Одна из самых неприятных проблем при работе с часовыми поясами:)
Вот моя проблема:
У меня есть код, который передает дату в WCF через объект JSON, и яиспользуйте «короткий» формат, где он содержит только миллисекунды с 1970 года без часового пояса.Этот DateTime анализируется WCF просто FINE
Я сохраняю дату в базе данных SQL Server.Пример: 2011-06-07 22: 17: 01.113 - дата, как я вижу это в SQL Server, и это прекрасно, так как я храню все в UTC.Итак, это (-5) часовой пояс и дата выглядит правильно.
Я загружаю поле даты в свой объект, используя EF, и свойство свойства объекта говорит, что это 22:17, и Kind = Unspecified, который снова в порядке, он загружается из SQL, я знаю, что этоUTC, но код не знает об этом, поэтому он загружает эту дату как неопределенную.
Я возвращаю этот объект клиенту WCF.Это может быть XML или JSON.Вот что случилось.Когда я JSON (это то, что указывает клиент) - я получаю это: 1307503021113-0500 на дату.Если мы преобразуем первую часть в DateTime, используя SQL:
SELECT DATEADD (ss, 1307503021, '1970-01-01')
2011-06-08 03: 17: 01.000
Часть выше уже неверна, нет?Если мы применим корректировку -5 часов, мы вернемся к 22:17, который уже будет?Эта часть меня уже смущает.Но что еще хуже - когда я десериализовываю с помощью JavaScriptSerializer - я вижу значение DateTime во вновь раздутом объекте с указанием вида UTC и 3:17 am
var oSerializer = new JavaScriptSerializer();
var returnValue = (T)oSerializer.Deserialize(s, typeof(T));
Я уже все озадачен, и мне интересно, можно ли заставить WCF принудительнои другие сериализаторы / десериализаторы, чтобы НЕ делать какие-либо смещения времени и прочее?Я бы предпочел отформатировать все даты для отображения вручную, и я хочу сохранить даты UTC в базе данных.
ОБНОВЛЕНИЕ:
Похоже, WCF думает, что если DateKind не указан, тоэто МЕСТНОЕ.Я сделал это: после того, как я получил объекты из EF, я указал Kind:
foreach (var tu in tripUpdates)
{
tu.DeviceTime = DateTime.SpecifyKind(tu.DeviceTime, DateTimeKind.Utc);
}
Это исправило это - теперь, когда WCF обслуживает объект, он не включает часовой пояс, который является БОЛЬШИМ.Теперь мой главный вопрос: есть ли способ как-то указать Kind для сущностей EF, чтобы мне не приходилось вручную указывать тип для каждой даты в сервисе?