为什么JSON中的datetime行为在不同的系统(win XP,Server 2003)上会有所不同?

时间:2020-03-06 14:21:16  来源:igfitidea点击:

我的Web应用程序分为WebGui和WebService。 WebService负责业务逻辑和数据库处理。
我从浏览器中的Java脚本中请求数据,具体取决于浏览器输入的日期和时间。该请求进入WebGui中的.asmx Url,并且在此函数内调用了Web服务。

在我的开发系统(windows xp)上,我获得了正确的数据,但是当我将其安装在测试系统上时,我必须添加本地时区差异才能获得正确的数据。

例如,我想要日期和时间" 21.07.2008 14:27:30"的数据,我必须发送" 21.07.2008 16:27:30"。

为什么两个系统上的行为不同,我应该怎么做才能使两个系统上的行为相同?

  • Web GUI位于ASP.NET 2.0 C#中
  • Web服务位于asp.net 1.1 c#中

更新

这是没有问题的,因为在JSON协议中以" / Date(1221738803000)/"发送日期和时间时,可以用不同的格式解释日期。这是解释/忘记时区的问题。

解决方案

根据服务器的区域性设置,日期将被不同地解释。 IE。给定日期:2008年5月1日,使用en-GB(英国)的文化将日期定为5月1日,使用带有美国英语的文化的系统将其读为1月5日。

要解决此问题,我们应确保始终以UTC格式(yyyy-mm-dd)传输日期,无论使用哪种文化,该日期都将始终以这种方式进行解释。

如果时区无关紧要,则将日期/时间作为格式字符串传递,这样我们就可以确切地知道它的外观,并使用DateTime.Parse将其转换为服务器端的DateTime。

我怀疑这与.NET 2.0中引入的DateTime.Kind属性有关。默认情况下,它设置为DateTimeKind.Unspecified,大多数时间与DateTimeKind.Local相同,因此当序列化日期时,它将转换为UTC。
我们可以在将其传递给Web服务调用之前,尝试使用DateTime.SpecifyKind(...)将Kind设置为DateTimeKind.Utc。

尝试使用Json.NET处理序列化。

请注意此处有关序列化格式的注释:

http://james.newtonking.com/archive/2008/08/25/json-net-3-0-released.aspx