MS JSON日期序列化和夏令时

时间:2013-03-14 14:17:22

标签: asp.net json datetime datacontractserializer

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

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

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

1 个答案:

答案 0 :(得分:1)

经过大量调试后我发现了问题:我不知道JSON序列化程序在{(1}}类和System.DateTime字面上的工作方式,当(de)在服务器和服务器之间来回序列化日期时浏览器。

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

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

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

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

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