【问题标题】:MS JSON date serialization and daylight saving timeMS JSON 日期序列化和夏令时
【发布时间】:2013-03-14 14:17:21
【问题描述】:

我们有一个托管在 ASP.NET 应用程序中的 Ajax Web 服务。此服务接受一个 DateTime 参数,就本问题而言,该参数应接收与 /Date(1359727200000-0200)/ 等效的 DateTime,这是 2013 年 2 月 1 日 9:00 AM 在巴西的 MS-JSON 文字时间。这个文字是浏览器在 Ajax 请求中发送的内容。

但传递给服务方法的参数不是接收日期和时间,而是 2013 年 2 月 1 日 12:00 PM。更糟糕的是,参数的 DateTimeKind 是Local。如果是Utc,这将是可以理解的,但即使这样也是不正确的,因为 2 月 1 日是巴西东部的夏令时,所以9:00 AM (local) sould be 11:00 AM (UTC)。这真是一团糟。顺便说一下,网络服务器在巴西东部时区运行。

是否有任何 ASP.NET 配置、服务方法注释、特定客户端指令或任何框架资源来解决此问题?

【问题讨论】:

  • 鉴于 12:00 AM 是午夜,可能在某处该值被解释为日期而不是日期和时间值。
  • @JoãoAngelo 打错字了,谢谢。一天中的时间实际上是下午 12:00。

标签: asp.net json datetime datacontractserializer


【解决方案1】:

经过大量调试后,我发现了问题:当(反)序列化在服务器和浏览器之间来回时,我不知道 JSON 序列化程序关于 System.DateTime 种类和 Date 文字的工作方式。

详细来说,这就是发生的事情。假设服务必须以 JSON 格式向客户端返回 DateTime 值。 DataContractJsonSerializer 将生成(臭名昭著的)/Date(UTC ticks)/ 格式的字符串,客户端可以将其解析为 JavaScript 日期值。此序列化对 DateTime 的 Kind 属性很敏感:

  • 当 Kind 为 DateTimeKind.Utc 时,字符串文字将包含“/Date(UTC ticks)/”且没有时区。
  • 当 Kind 为 DateTimeKind.Local 时,字符串文字将包含“/Date(UTC ticks-time zone)/”。
  • 如果 Kind 是 DateTimeKind.Unspecified,则假定为 Local

相反,如果客户端向服务发送日期值,则序列化过程对 JSON 文字的“种类”也很敏感:

  • 当文字的格式为“/Date(UTC ticks)/”且没有时区时,生成的 DateTime 将是 DateTimeKind.Utc 类型。
  • 当文字格式为“/Date(UTC ticks-time zone)/”时,生成的 DateTime 将是 DateTimeKind.Local 类型。

我所要做的就是确保客户端只向服务发送 UTC 格式的日期文字。现在一切都很好。

【讨论】:

    猜你喜欢
    • 2012-12-21
    • 1970-01-01
    • 2012-07-09
    • 2012-04-07
    • 1970-01-01
    • 2011-04-30
    • 2015-12-23
    • 1970-01-01
    • 2012-06-06
    相关资源
    最近更新 更多