JavaScript的Date对象是否容易受到Y2038问题的影响?

时间:2009-10-22 15:40:39

标签: javascript datetime

假设一个32位操作系统/浏览器,如果我将日期设置为超过2038,那么在JavaScript中创建的Date对象是否可以翻转到1970年?

Mozilla documentation表示一年可以设置为9999,但是我不知道这在所有JavaScript实现中是否一致,或者这是否是规范所指示的准确描述。

我认为考虑到文档中的措辞,它似乎是使用64位数字来存储时间或以ISO日期格式存储实际数据。

有谁知道浏览器如何实现这个?

2 个答案:

答案 0 :(得分:19)

不应该 - 根据ECMAScript specification seciont 15.9.1.1:

  

自UTC时间1970年1月1日起,时间以ECMAScript为单位,以毫秒为单位。闰秒被忽略。假设每天恰好有86,400,000毫秒。 ECMAScript数值可以表示从-9,007,199,254,740,991到9,007,199,254,740,991的所有整数;此范围足以测量从UTC时间1970年1月1日起向前或向后约285,616年内的任何瞬间的毫秒精度。

     

ECMAScript日期对象支持的实际时间范围略小:相对于UTC时间1970年1月1日午夜测量的确切时间为-100,000,000天到100,000,000天。

     

这使得1月1日任何一方的范围为8,640,000,000,000,000毫秒,   1970 UTC 1970年1月1日开始午夜的确切时刻由值+0表示。

答案 1 :(得分:1)

JS中只有按位运算符是32位。没有版本可以更改此设置,并且如果您的操作系统是64位,也没有任何区别。因此,如果有人在时间戳上使用按位,则可能会发生这种情况。例如,这里我使用按位,因为我希望将它们转换为int的所有按位运算符的副作用,所以我松开了日期的毫秒数。

new Date('2038-01-01T01:01:01.345') / 1000 | 0; // 2145913261.
new Date('2039-01-01T01:01:01.345') / 1000 | 0; // -2117518035. Wraps around...

我可能会使用其他任何东西,例如Math.round或parseInt,这不会有问题,但是如果我按位使用,它将会环绕。