Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net MS JSON日期序列化和夏令时_Asp.net_Json_Datetime_Datacontractserializer - Fatal编程技术网

Asp.net 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日是巴西东

我们在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日是巴西东部的夏令时,所以。真是一团糟。顺便说一下,web服务器在巴西东部时区下运行


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

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

具体来说,下面是发生的情况。假设服务必须以JSON格式向客户机返回日期时间值。
DataContractJsonSerializer
将生成一个(臭名昭著的)/Date(UTC ticks)/格式的字符串,客户端可以将其解析为JavaScript日期值。此序列化对DateTime的Kind属性敏感:

  • 当种类为
    DateTimeKind.Utc
    时,字符串文字将包含“/Date(Utc ticks)/”且不包含时区
  • 当种类为
    DateTimeKind.Local
    时,字符串文字将包含“/Date(UTC时钟时区)/”
  • 如果种类为
    DateTimeKind.Unspecified
    ,则假定为
    Local
相反,如果客户端向服务发送日期值,则序列化过程也会对JSON文本的“种类”敏感:

  • 如果文本的格式为“/Date(UTC ticks)/”且没有时区,则生成 日期时间将为
    DateTimeKind.Utc
    kind
  • 当文本格式为“/Date(UTC ticks time zone)/”时,生成的日期时间将为
    DateTimeKind.Local
    kind

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

考虑到上午12:00是午夜,可能在某个地方,该值被解释为只是一个日期,而不是日期和时间值。@JoãoAngelo输入错误,谢谢。一天的时间实际上是下午12点。