以 JSON 日期表示的时区

Time Zones in Json Date

本文关键字:时区 表示 日期 JSON      更新时间:2023-09-26

我正在通过 REST 服务向我的客户端发送 Json 数据。此客户端应使用数据来显示它。

我的客户使用 JavaScript。我通过以下方式转换日期:

var from = new Date(myJsonDate.match(/'d+/)[0] * 1);

JSON 如下所示:

 ...="From":"'/Date(1450134000000)'/" ...

我的问题是日期在德国是正确的,但在巴西却相差一天(例如,在巴西显示星期日而不是星期一(。此代码是否使用时区并相应地计算?我怎样才能关闭它?我希望日期显示的日期与我发送的日期完全相同。

JavaScript 中带有日期的操作具有配置客户端计算机的时区变体。

正确的机会必须修复一个显示日期差异的函数,没有人知道,因为。当您实例化日期时,返回 her 显示为:"星期四 Feb 14 2008 08:41:27 GMT-0300(巴西官方时间("请注意,日期具有 GMT(格林威治标准时间(,指示日期配置在哪个时区。

我将在带有日期的操作中显示避免由此引起的时间差异。为此,我们创建了一个函数,该函数始终将日期转换为等待的时区。

var calculateTimeZone = function(date, offset) {
    var miliseconds_with_utc = date.getTime() +  (date.getTimezoneOffset() * 60000);
    return new Date(miliseconds_with_utc + (3600000 * offset));
 }

请注意,在第 3 行中,我们调用了方法 getTime((,该方法将本地日期时刻转换为自 1970 年 1 月 1 日(Unix 纪元(以来以毫秒表示的数字。我们通过 API 的 geTimezoneOffset(( 方法获取在浏览器中设置的当前时区,即 JavaScript 中的日期,然后乘以一小时的毫秒时间。然后我们添加两个值。

为什么是一个小时?

为什么这是代表每个时区的时间。默认情况下,此方法以分钟为单位返回此时区,因此需要以小时为单位进行转换。为了达到这个数字 60000,请记住 1 秒有 1000 毫秒,哪 1 分钟有 60 秒,然后将分钟转换为毫秒,我们将 60*1000 = 60000

这一刻,我们有由变量"UTC"表示的UTC(协调世界时(,以毫秒为单位的本地时刻时区的总和。我们现在需要得到一个以这个UTC开头的日期,加上命运的时区,例如,以时区+5表示的日期如何转换巴西时区(巴西小时(。

请注意,在第 5 行中,我们得到了一个以小时为单位的偏移量(时区表示(,并转换为毫秒。请记住,这里的 1 秒有 1000 毫秒,哪 1 小时有 3600 秒,然后以毫秒为单位的转换小时应该乘以 1000 * 3600 = 3600000。

我们将此结果与变量"utc"的值相加,我们得到了想要的时区的时刻。然后,我们创建一个新的日期,基于长适当并返回这个新日期。

通过这种方式,当我们需要在正确的时区表示日期时,我们可以保持应用程序中所需的完整性。

此代码是否使用时区并相应地计算?

不。将数字传递给 Date 构造函数被解释为时间值,即自 1970-01-01T00:00:00Z 以来的毫秒数。无论客户端的设置如何,它都会为完全相同的时刻创建一个日期。

但是,默认情况下,Date.prototype.toString 使用主机系统设置将偏移量应用于显示的值作为"本地"时间。

我怎样才能关闭它?

修改脚本引擎。它是 ECMAScript 标准的一部分,所以任何不这样做的实现都是不合规的。

我希望日期显示的日期与我发送的日期完全相同。

也:

  1. 将其作为纯字符串发送,而不是作为日期发送
  2. 还要发送源的时区偏移量,以便您可以在另一端应用它以保持日期相同。

ECMAScript 偏移量与大多数标准具有相反的含义,它们是 -ve 表示东,+ve 表示西方,因此要获得具有与源系统相同的本地设置的日期:

var d = new Date(timevalue);
d.setMinutes(d.getMinutes() + d.getTimezoneOffset() - sourceTimezoneOffset);

其中 sourceTimezoneOffset 是源系统的偏移量(以分钟为单位(,+ve 表示西部,-ve 表示东部。

通常日期与特定时区相关,因此如前所述,一个地方的日期可能与同一时刻另一个地方的日期不同。

如果在从服务器端发送时未对日期进行任何修改,则日期将采用托管服务器的时区。

因此,如果您的服务器托管在德国,则日期将使用德国的时区。

有两种方法可以解决这个问题:

  1. 在响应中以用户时区向客户端发送日期。
  2. 在客户端应用程序中进行调整以实现适当的日期转换。