问题在C#中反序列化JSON日期 - 增加2小时

时间:2010-11-29 14:05:10

标签: c# json javascriptserializer

在将JSON日期反序列化为C#DateTime时,我们遇到了这样一个令人讨厌的问题。

代码是:

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

jsonTrechos是一串json2.js的JSON.stringify();

问题是:反序列化工作,在Trechos对象的所有日期加上2小时。

我的时区是巴西(UTC -3),我们正在夏令时(所以我们目前在UTC -2),如果它有任何关系。我想也许本地化和时区可能会在这方面发挥作用,如果真的如此,我不知道如何修复它。

4 个答案:

答案 0 :(得分:12)

MSDN

中记录了这一点
  

Date对象,以JSON表示为   “/日期(滴答数)/”。该   刻度数是正数或   负长值表示   滴答数(毫秒)   已经过了午夜 01   1970年1月,UTC。

尝试拨打DateTime.ToLocalTime(),看看你是否得到了正确的日期。

答案 1 :(得分:6)

强烈建议使用Json.NET library。坦率地说,.NET框架中的JSON序列化程序(以及多个序列化程序)在某些方面都很古怪,特别是在序列化日期时。

Json.NET是我见过的唯一一个能够持续处理它们(以及一般的JSON)并且对其他消费者没有问题的库。

答案 2 :(得分:2)

为JSON指定的日期是UTC,正如您所提到的,您正在使用夏令时,因此+2小时是有意义的。理想情况下,您应该使用UTC日期时间,因为它消除了夏令时的麻烦(或者在这种情况下,它被添加到它中)并允许全局托管。

答案 3 :(得分:1)

“Javascript日期的计算时间为毫秒,从1970年1月1日1970:00 00:00:00世界时(UTC),一天包含86,400,000毫秒”(摘自W3schools)。所以你想把它转换成你当地的时区。

TimeZoneInfo.ConvertTimeFromUtc(yourDateToConvert, TimeZoneInfo.Local)