【问题标题】:.net JSON serializer returns local client time to browser?.net JSON 序列化程序将本地客户端时间返回给浏览器?
【发布时间】:2009-10-14 22:46:33
【问题描述】:

我使用 asp.net [WebMethod] 将 .net 对象推送回浏览器上的 Ajax 调用。 对象的属性之一是 DateTime 类型。

当它到达浏览器时,时间比存储在 SQL Server 中的时间早了七个小时。

好的,所以我的浏览器在秘鲁 (GMT-5) 而服务器在德国(目前是 GMT+2),这就是 7 小时的来源。

作为修复,我使用 Ajax 请求在客户端发送 UTC 偏移量

d = new Date();
d.getTimezoneOffset();

然后在服务器上我找出偏移量:

  // get a local time zone info
  TimeZoneInfo tz = TimeZoneInfo.Local;

  // get it in hours
  int offset = tz.BaseUtcOffset.Hours;

  // add one hour if we are in daylight savings
  if (tz.IsDaylightSavingTime(DateTime.Now))
  {
      offset++;
  }

现在我可以在对象发送到浏览器之前修复时间字段。

我真正的问题是,序列化程序如何知道 7 小时?

http 请求不包含任何时间信息。

如果我想要存储在数据库中的确切时间,我是否要求太多?

更新:

这里是一个例子,数据库中的日期是:2009-Oct-15 22:00

没有附加时区信息。

当我在客户端和服务器所在的开发机器上调用 WebMethod 时 显然在同一时区,来自服务器的 JSON 是:

{"d":{"TheDate":"\/Date(1255662000000)\/"}}

来自德国远程服务器的 JSON 是:

{"d":{"TheDate":"\/Date(1255636800000)\/"}}

在 Firebug 中看到的 JSON 有 7 小时的差异。在这 点还没有涉及到 JavaScript。

我的一个想法是 asp.net 将 TimeZone 附加到会话,但似乎并非如此。

【问题讨论】:

标签: asp.net json timezone


【解决方案1】:

要回答 OP 的问题,时区信息隐含在转换为 JSON /Date()/ 格式的过程中,因为它与 UTC 相关。例如,在我在纽约的服务器上,如果我返回 DateTime.Parse("1/1/1970"),它会返回 /Date(18000000)/,或者,5 小时(我们现在在 DST),它是自 1970 年 1 月 1 日 UTC 以来的秒数,因为转换显示,“嘿,这里是 1970 年 1 月 1 日 00:00:00 在纽约,所以它必须是 1/1 /70 05:00:00 回到格林威治。”

现在,如果加利福尼亚的客户收到此日期表示法,并简单地以毫秒为单位实例化 JavaScript 日期(例如 new Date(18000000)),浏览器会说:“嘿,这是一个日期对象,我知道相对于 UTC,我知道我距离格林威治 8 小时,所以它必须是 12/31/1969 21:00:00。"

所以这是一种处理时间的非常聪明的方法,因此它在所有时区都是“正确的”,并且所有本地化都由用户的浏览器处理。不幸的是,我们经常只处理一个我们不想与时区相关的原始日期(比如生日)。如果我们需要保持日期不变,我知道有两种方法。

首先,正如您在上面所做的那样,是调整时间(尽管我认为您也需要在浏览器上进行调整,如果您希望它在任何时区工作)。

另一种方法是将其作为字符串返回,已经格式化。这是我通常采用的方法,但我通常与美国客户合作(因此我可以返回 MM/DD/YYYY,例如,他们不会因为我是美国人而生我的气)。

【讨论】:

    【解决方案2】:

    为避免出现奇怪的错误并不得不处理此类问题,您应该始终使用 UTC 并在可能的最后一刻转换为本地时间。

    DateTime 到达浏览器后,您如何检查它?您确定原始序列化格式不包括作为 DateTime 对象一部分的偏移量吗?在这种情况下,它可以在本地时间的另一端重组

    【讨论】:

      【解决方案3】:

      我刚刚遇到了同样的问题。 Json Serializer 似乎返回系统所在的默认时区中的日期(基本上忽略了 DateTime 所在的时区)。

      例如: 在我的开发机器上,它返回我的机器所在时区的日期(太平洋);在我们的生产机器上,JSON 日期采用 UTC - 这是服务器设置的时区。

      为了解决这个问题,在我们的例子中,我们必须通过 javascript 在客户端中手动添加小时偏移、分钟偏移和夏令时偏移。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-08-15
        • 2021-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多