Firefox中Epoch的错误JavaScript日期时间戳

时间:2016-10-14 20:44:50

标签: javascript date firefox

我在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(东部夏令时间)。 valueOf:1476428709000

     

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

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

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

     

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

     

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

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

1 个答案:

答案 0 :(得分:0)

  

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

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

  

如果我像Date(epoch * 1000)一样直接设置它会起作用,也会设置为AVCSeconds。

将单个数字值传递给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);