Asp.net MS JSON日期序列化和夏令时
我们在ASP.NET应用程序中托管了一个Ajax web服务。此服务接受DateTime参数,就本问题而言,该参数应接收相当于巴西时间2013年2月1日上午9:00的MS-JSON文本的日期时间Asp.net MS JSON日期序列化和夏令时,asp.net,json,datetime,datacontractserializer,Asp.net,Json,Datetime,Datacontractserializer,我们在ASP.NET应用程序中托管了一个Ajax web服务。此服务接受DateTime参数,就本问题而言,该参数应接收相当于巴西时间2013年2月1日上午9:00的MS-JSON文本的日期时间/Date(1359727200000-0200)/。此文本是浏览器在Ajax请求中发送的内容 但是没有收到该日期和时间,传递给服务方法的参数是2013年2月1日下午12:00。更糟糕的是,参数的DateTimeKind是Local。如果是Utc,这是可以理解的,但即使是这样也不正确,因为2月1日是巴西东
/Date(1359727200000-0200)/
。此文本是浏览器在Ajax请求中发送的内容
但是没有收到该日期和时间,传递给服务方法的参数是2013年2月1日下午12:00。更糟糕的是,参数的DateTimeKind是Local
。如果是Utc,这是可以理解的,但即使是这样也不正确,因为2月1日是巴西东部的夏令时,所以。真是一团糟。顺便说一下,web服务器在巴西东部时区下运行
是否有任何ASP.NET配置、服务方法注释、特定的客户端指令或任何框架资源来解决此问题?经过大量调试后,我发现了问题:我不知道JSON序列化程序在
System.DateTime
种类和Date
literal when(de)方面的工作方式在服务器和浏览器之间来回序列化日期
具体来说,下面是发生的情况。假设服务必须以JSON格式向客户机返回日期时间值。DataContractJsonSerializer
将生成一个(臭名昭著的)/Date(UTC ticks)/格式的字符串,客户端可以将其解析为JavaScript日期值。此序列化对DateTime的Kind属性敏感:
- 当种类为
时,字符串文字将包含“/Date(Utc ticks)/”且不包含时区DateTimeKind.Utc
- 当种类为
时,字符串文字将包含“/Date(UTC时钟时区)/”DateTimeKind.Local
- 如果种类为
,则假定为DateTimeKind.Unspecified
Local
- 如果文本的格式为“/Date(UTC ticks)/”且没有时区,则生成
日期时间将为
kindDateTimeKind.Utc
- 当文本格式为“/Date(UTC ticks time zone)/”时,生成的日期时间将为
kindDateTimeKind.Local
我所要做的就是确保客户端只向服务发送UTC格式的日期文本。现在一切都很好。考虑到上午12:00是午夜,可能在某个地方,该值被解释为只是一个日期,而不是日期和时间值。@JoãoAngelo输入错误,谢谢。一天的时间实际上是下午12点。