我们在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配置,服务方法注释,特定客户端指令或任何框架资源来解决此问题?
答案 0 :(得分:1)
经过大量调试后我发现了问题:我不知道JSON序列化程序在{(1}}类和System.DateTime
字面上的工作方式,当(de)在服务器和服务器之间来回序列化日期时浏览器。
详细说明,这是发生的事情。假设服务必须以JSON格式将DateTime值返回给客户端。 Date
将生成(臭名昭着的) / Date(UTC ticks)/ 格式的字符串,客户端可以将其解析为JavaScript Date值。此序列化对DateTime的Kind属性敏感:
DataContractJsonSerializer
时,字符串文字将包含“/ Date(UTC ticks)/”且没有时区。DateTimeKind.Utc
时,字符串文字将包含“/ Date(UTC ticks-time zone)/”。DateTimeKind.Local
,则会假定为DateTimeKind.Unspecified
。相反,如果客户端向服务发送日期值,则序列化过程也对JSON文字的“种类”敏感:
Local
种。DateTimeKind.Utc
种。我所要做的就是确保客户端只向服务发送UTC格式的日期文字。一切都很棒。