5

在将 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

4 回答 4

12

这记录在MSDN中:

日期对象,在 JSON 中表示为“/Date(number of ticks)/”。刻度数是一个正数或负长整数值,表示自UTC 1970 年 1 月 1 日午夜以来经过的刻度数(毫秒) 。

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

于 2010-11-29T14:20:50.663 回答
7

强烈建议使用Json.NET 库。坦率地说,.NET 框架中的 JSON 序列化程序(并且有多个)在某些方面都很古怪,尤其是在序列化日期方面。

Json.NET 是我见过的唯一一个可以始终如一地处理它们(以及一般的 JSON)并且对其他消费者没有问题的库。

于 2010-11-29T14:13:34.957 回答
2

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

于 2010-11-29T14:23:49.213 回答
1

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

TimeZoneInfo.ConvertTimeFromUtc(yourDateToConvert, TimeZoneInfo.Local)
于 2011-03-07T22:00:06.083 回答