4

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

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

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

4

1 回答 1

2

经过大量调试后,我发现了问题:当(反)序列化在服务器和浏览器之间来回时,我不知道 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 格式的日期文字。现在一切都很好。

于 2013-03-15T21:31:18.447 回答