问题在C#中反序列化JSON日期 – 增加2小时
在将JSON日期反序列化为C#DateTime时,我们遇到了这样一个令人讨厌的问题。
代码是:
JavaScriptSerializer serializer = new JavaScriptSerializer(); jsonTrechos = jsonTrechos.Replace("/Date(", "\\/Date(").Replace(")/", ")\\/"); Trecho[] model = serializer.Deserialize(jsonTrechos);
jsonTrechos
是一串json2.js的JSON.stringify();
。
问题是:反序列化工作,在Trechos对象的所有日期加上2小时。
我的时区是巴西(UTC -3),我们正在夏令时(所以我们目前在UTC -2),如果它有任何关系。 我想也许本地化和时区可能会在这方面发挥作用,如果真的如此,我不知道如何解决它。
这在MSDN中有记录 :
日期对象,以JSON表示为“/日期(刻度数)/”。 刻度数是一个正或负的长值,表示自UTC时间1970年1月1日午夜以来经过的刻度数(毫秒) 。
尝试调用DateTime.ToLocalTime()
,看看你是否得到了正确的日期。
我强烈建议使用Json.NET库 。 坦率地说,.NET框架中的JSON序列化程序(以及多个序列化程序)在某些方面都很古怪,特别是在序列化日期时。
Json.NET是我见过的唯一一个能够持续处理它们(以及一般的JSON)并且对其他消费者没有问题的库。
为JSON指定的日期是UTC,正如您所提到的,您正在使用夏令时,因此+2小时是有意义的。 理想情况下,您应该使用UTC日期时间,因为它消除了夏令时的麻烦(或者在这种情况下,它被添加到它)并允许全局托管。
“Javascript日期以毫秒为单位,从1970年1月1日00:00:00世界时(UTC)开始,每天包含86,400,000毫秒”(摘自W3schools)。 所以你想把它转换成你当地的时区。
TimeZoneInfo.ConvertTimeFromUtc(yourDateToConvert, TimeZoneInfo.Local)