为啥 JSON 中 datetime 的行为在不同系统(win xp,server 2003)上有所不同?

Posted

技术标签:

【中文标题】为啥 JSON 中 datetime 的行为在不同系统(win xp,server 2003)上有所不同?【英文标题】:Why is the behaviour of datetime in JSON different on different systems (win xp, server 2003)?为什么 JSON 中 datetime 的行为在不同系统(win xp,server 2003)上有所不同? 【发布时间】:2010-09-10 16:30:34 【问题描述】:

我的 Web 应用程序分为 WebGui 和 WebService。 WebService 负责业务逻辑和数据库处理。 从浏览器中的 javascript 我请求数据,具体取决于作为浏览器输入的日期和时间。此请求转到 WebGui 中的 .asmx 网址,并在此函数内调用 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)/”形式发送日期和时间时,以不同格式解释日期是没有问题的。这是解释/忘记时区的问题。

【问题讨论】:

【参考方案1】:

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

【讨论】:

我目前看到 DateTimeKind.Unspecified 似乎被视为 UTC。如果 DateTime 已经在“本地”时区,我将在返回之前将其转换回 UTC。这似乎可以在服务器上运行,在本地运行它仍然需要在返回之前转换为“本地”时区。真的很烂!【参考方案2】:

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

请注意此处关于序列化格式的 cmets:

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

根据服务器的文化设置,日期的解释会有所不同。 IE。给定日期:01.05.2008 en-GB(英国)的文化将日期读取为 5 月 1 日,具有 en-US 文化的系统将其读取为 1 月 5 日。

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

【讨论】:

这在以不同格式解释日期是没有问题的,因为日期和时间在 JSON 协议中发送为“\/Date(1221738803000)\/”。这是解释/忘记时区的问题。 (我已经更新了问题)

以上是关于为啥 JSON 中 datetime 的行为在不同系统(win xp,server 2003)上有所不同?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 'axios' 和 $http (vue-resource) 对于 json 查询字符串的行为不同?

为啥 datetime 为同一时区提供不同的时区格式?

为啥 python datetime replace timezone 返回不同的时区?

为啥受保护的修饰符在 Java 子类中的行为不同?

为啥 comb 在循环内的行为不同?

为啥 srandom(time(NULL)) 在 main() 函数和用户定义函数中的行为不同?