【问题标题】:Problem deserializating JSON Date in C# - adding 2 hours在 C# 中反序列化 JSON 日期的问题 - 增加 2 小时
【发布时间】:2010-11-29 14:05:10
【问题描述】:

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

代码是:

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

jsonTrechos是json2.js的JSON.stringify();的字符串。

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

我的时区是巴西 (UTC -3),我们正处于夏令时(所以我们目前处于 UTC -2),如果有任何事情要做的话。我想也许本地化和时区可能在这方面发挥了作用,如果确实如此,我不知道如何解决它。

【问题讨论】:

  • 顺便说一句,这些替换在那里,因此序列化程序可以识别“\/Date(number)\/”格式。
  • 我建议在内部使用 UTC 日期,除非有令人信服的理由不这样做。在您需要非 UTC 日期的情况下,简单的本地日期也不能很好地工作,但您通常需要更复杂的时间来处理时区。

标签: c# json javascriptserializer


【解决方案1】:

这记录在MSDN:

日期对象,在 JSON 中表示为 “/日期(刻度数)/”。这 刻度数为正数或 负长值,表示 滴答数(毫秒) 自午夜 01 以来已过去 UTC 时间 1970 年 1 月。

尝试致电DateTime.ToLocalTime(),看看您是否得到了正确的日期。

【讨论】:

【解决方案2】:

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

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

【讨论】:

  • 有道理,我玩了一点,我喜欢它。我去看看,谢谢!
  • 这在日期处理和性能方面比 javascriptserializer 类要好得多,谢谢!!
【解决方案3】:

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

【讨论】:

  • 你是对的,这样做是最好的,但是要让这个系统适应这个需要很长时间。不过谢谢你的建议!
【解决方案4】:

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

TimeZoneInfo.ConvertTimeFromUtc(yourDateToConvert, TimeZoneInfo.Local)

【讨论】:

    猜你喜欢
    • 2012-06-09
    • 1970-01-01
    • 2021-03-06
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 2022-08-15
    • 2012-01-10
    • 1970-01-01
    相关资源
    最近更新 更多