Проблема с датами в сервисе WCF и в декодере JavaSerializer - PullRequest
2 голосов
/ 08 июня 2011

Одна из самых неприятных проблем при работе с часовыми поясами:)

Вот моя проблема:

  1. У меня есть код, который передает дату в WCF через объект JSON, и яиспользуйте «короткий» формат, где он содержит только миллисекунды с 1970 года без часового пояса.Этот DateTime анализируется WCF просто FINE

  2. Я сохраняю дату в базе данных SQL Server.Пример: 2011-06-07 22: 17: 01.113 - дата, как я вижу это в SQL Server, и это прекрасно, так как я храню все в UTC.Итак, это (-5) часовой пояс и дата выглядит правильно.

  3. Я загружаю поле даты в свой объект, используя EF, и свойство свойства объекта говорит, что это 22:17, и Kind = Unspecified, который снова в порядке, он загружается из SQL, я знаю, что этоUTC, но код не знает об этом, поэтому он загружает эту дату как неопределенную.

  4. Я возвращаю этот объект клиенту 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, чтобы мне не приходилось вручную указывать тип для каждой даты в сервисе?

1 Ответ

2 голосов
/ 08 июня 2011

Когда вы получаете datetime через оператор SELECT, всегда устанавливайте DateTime.Kind в UTC.Таким образом, WCF / XML не будет пытаться настроить время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...