我正在通过 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 标准的一部分,所以任何不这样做的实现都是不合规的。
我希望日期显示的日期与我发送的日期完全相同。
也:
- 将其作为纯字符串发送,而不是作为日期发送
- 还要发送源的时区偏移量,以便您可以在另一端应用它以保持日期相同。
ECMAScript 偏移量与大多数标准具有相反的含义,它们是 -ve 表示东,+ve 表示西方,因此要获得具有与源系统相同的本地设置的日期:
var d = new Date(timevalue);
d.setMinutes(d.getMinutes() + d.getTimezoneOffset() - sourceTimezoneOffset);
其中 sourceTimezoneOffset 是源系统的偏移量(以分钟为单位(,+ve 表示西部,-ve 表示东部。
通常日期与特定时区相关,因此如前所述,一个地方的日期可能与同一时刻另一个地方的日期不同。
如果在从服务器端发送时未对日期进行任何修改,则日期将采用托管服务器的时区。
因此,如果您的服务器托管在德国,则日期将使用德国的时区。
有两种方法可以解决这个问题:
- 在响应中以用户时区向客户端发送日期。
- 在客户端应用程序中进行调整以实现适当的日期转换。