【问题标题】:Bad JavaScript Date Timestamps from Epoch in Firefox来自 Firefox 中 Epoch 的错误 JavaScript 日期时间戳
【发布时间】:2017-02-24 09:23:05
【问题描述】:

我在 Windows 7(64 位)机器上使用 Firefox。我最近的任务是修复一个错误,该错误导致此代码产生了一些错误的本地时间戳

var d = new Date(0);
d.setSeconds(epoch);

我不知道为什么要这样写,有充分的理由这样做吗?如果我直接使用new Date(epoch * 1000); 设置它,它会起作用,setUTCSeconds 也可以。

第二个问题是 Firefox 说“东部标准时间”实际上是白天时间。 Chrome 不这样做。

Javascript 是一种语言,我知道为脚本提供服务的基础知识,但是,我来自 C 和 C++。我在这里缺少什么吗?我已经查看了Date,但我无法找出修复代码的最佳方法,或者为什么它是这样编写的。都具有相同的getTimezoneOffset,如下所示。

var d = new Date(1476428709 * 1000);
alert(d.toTimeString());

Chrome:03:05:09 GMT-0400(东部夏令时间)。价值:1476428709000

Firefox:03:05:09 GMT-0400(东部标准时间)。价值:1476428709000

var d = new Date(0);
d.setSeconds(1476428709);
alert(d.toTimeString());

Chrome:02:05:09 GMT-0400(东部夏令时间)。价值:1476425109000

Firefox:02:05:09 GMT-0400(东部标准时间)。价值:1476425109000

Firefox 使用setUTCSeconds:03:05:09 GMT-0400(东部标准时间):1476428709000


编辑:白天时间问题似乎是 Firefox 中的一个错误:
879261 – javascript seems to be using time zones backwards

【问题讨论】:

  • 您似乎得到了相同的时间戳,只是字符串表示不同,这并不重要,因为您通常不会将其用于任何事情,您会使用 Date 方法获取月、日、年等。

标签: javascript date firefox


【解决方案1】:

我最近的任务是修复一个错误,该错误导致由基本上是 var d = new Date(0); d.setSeconds(epoch); 的代码生成的一些错误的本地时间戳。我不知道为什么它是这样写的,有充分的理由这样做吗?

没有。 new Date(millisecondsSinceEpoch) 被指定可以正常工作。也许这是针对特定实现中的错误的解决方法。

如果我像 Date(epoch * 1000) 那样直接设置它,它会起作用并且还 setUTCSeconds。

将单个数值传递给Date constructor 时,它被视为自纪元以来的UTC 毫秒数,因此:

var d = new Date(number) 

相当于:

var d = new Date(0);
d.setUTCMilliseconds(number);

第二个问题是 Firefox 在夏令时显示东部标准时间。 Chrome 不这样做。

本地时区偏移量由主机确定,它与语言无关,因此可能是实现问题。

当你这样做时:

d.setSeconds(1476428709)

秒的任何溢出都会添加到日期的其余部分,它不用作与纪元的偏移量。所以如果 d 是一个 Date 实例,那么:

d.setSeconds(1476428709);

d.setUTCSeconds(1476428709);

返回相同的结果,例如

var a = new Date();
var b = new Date(+a);
a.setSeconds(1476428709);
b.setUTCSeconds(1476428709);

console.log(a, b);

【讨论】:

  • 1.为了清楚起见,对于最后一个示例,您将演示通过 Date() 创建当前日期然后将任意 n 添加到该日期时会发生什么?2。您是说 Firefox 无法显示“东部夏令时间”是他们的实施问题吗?你能重现我做的例子吗?在提交错误之前,我想先确认一下。
  • 我更新了我的问题,指出第二个问题是 Firefox 中的一个错误。他们正在努力解决这个问题。
  • 1.它表明添加秒或 UTCSeconds 是等效的。分钟或小时不一定是这种情况,因为时区偏移可能会影响这些值。 2. Date 的 toString 产生的字符串是依赖于实现的,根本不需要包含时区名称(并且没有这样的命名标准)。将您的 PC 设置到某个模糊的时区,看看会发生什么。日期应该正确调整主机时区设置,包括夏令时。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-23
  • 2013-03-02
  • 2018-12-23
  • 1970-01-01
  • 2020-11-02
  • 2014-05-22
相关资源
最近更新 更多