Проблема десериализации JSON Date в C # - добавление 2 часов - PullRequest
5 голосов
/ 29 ноября 2010

У нас такая неприятная проблема при десериализации даты JSON в C # DateTime.

Код:

JavaScriptSerializer serializer = new JavaScriptSerializer();
jsonTrechos = jsonTrechos.Replace("/Date(", "\\/Date(").Replace(")/", ")\\/");
Trecho[] model = serializer.Deserialize<Trecho[]>(jsonTrechos);

jsonTrechos - это строка из json2.jsJSON.stringify();.

Проблема в том, что десериализация работает, но все даты объектов Trechos добавляются за 2 часа.

Мой часовой пояс - Бразилия (UTC-3), и мы находимся подпереход на летнее время (таким образом, мы в настоящее время на UTC-2), если это имеет какое-либо отношение.Я предполагаю, что, возможно, локализация и часовые пояса могут играть роль в этом, и если это действительно так, я понятия не имею, как это исправить.

Ответы [ 4 ]

12 голосов
/ 29 ноября 2010

Это задокументировано в MSDN :

Объект Date, представленный в JSON как "/ Дата (количество тиков) /". количество тиков является положительным или отрицательное длинное значение, которое указывает на количество тиков (миллисекунд) с полуночи 01 Январь 1970 UTC.

Попробуйте позвонить по номеру DateTime.ToLocalTime() и посмотреть, получите ли вы правильную дату.

6 голосов
/ 29 ноября 2010

Я бы настоятельно рекомендовал бы работать с библиотекой Json.NET . Откровенно говоря, сериализаторы JSON (и их несколько) в .NET Framework все в некотором роде причудливы, особенно когда дело касается сериализации дат.

Json.NET - единственная библиотека, которую я видел, которая обрабатывает их (и JSON в целом) последовательно и без проблем для других потребителей.

2 голосов
/ 29 ноября 2010

Даты, указанные для JSON, указаны в формате UTC, и, как вы упомянули, вы используете летнее время, поэтому имеет смысл +2 часа. В идеале вы все равно должны работать с датой UTC, так как это устраняет головные боли перехода на летнее время (или в данном случае добавляется к нему) и позволяет использовать глобальный хостинг.

1 голос
/ 08 марта 2011

«Даты Javascript рассчитываются в миллисекундах с 1 января 1970 года 00:00:00 по всемирному времени (UTC) с днем, содержащим 86 400 000 миллисекунд» (выдержка из W3schools) Итак, вы хотите преобразовать его в местный часовой пояс.

TimeZoneInfo.ConvertTimeFromUtc(yourDateToConvert, TimeZoneInfo.Local)
...