在将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),如果它有任何关系。我想也许本地化和时区可能会在这方面发挥作用,如果真的如此,我不知道如何修复它。
答案 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)