关于在C#中反序列化JSON日期的问题:在C#中反序列化JSON日期 – 添加2小时

Problem deserializating JSON Date in C# - adding 2 hours

在将JSON日期反序列化为C日期时间时,我们遇到了一个非常棘手的问题。

代码是:

1
2
3
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)。我想可能是本地化和时区在这方面起了作用,如果它们真的起作用,我不知道如何修复它。


这在msdn中有记录:

Date object, represented in JSON as
"/Date(number of ticks)/". The
number of ticks is a positive or
negative long value that indicates the
number of ticks (milliseconds) that
have elapsed since midnight 01
January, 1970 UTC.

试着打电话给DateTime.ToLocalTime(),看看你有没有正确的日期。


我强烈建议使用json.net库。坦率地说,.NET框架中的JSON序列化程序(有多个)在某种程度上都很奇怪,特别是在序列化日期方面。

json.net是我所见过的唯一一个能够一致地处理它们的库(以及一般的json),并且对其他用户没有任何问题。


为JSON指定的日期是UTC,正如您提到的,您使用的是夏令时,所以+2小时是有意义的。理想情况下,您无论如何都应该使用UTC日期时间,因为它消除了日光节约的麻烦(或者在本例中,它被添加到其中),并允许全球托管。


"Javascript日期从1970年1月1日00:00:00世界时间(UTC)开始以毫秒计算,其中一天包含86400000毫秒"(摘自W3Schools)。所以你想把它转换成你的本地时区。

1
TimeZoneInfo.ConvertTimeFromUtc(yourDateToConvert, TimeZoneInfo.Local)