为什么JavaScript Date构造函数对此编号失败,但可以很好地用作方法

时间:2018-11-23 14:37:42

标签: javascript typescript date

老实说,我不确定如何表达这个问题。基本上打开一个JavaScript控制台(节点,您的浏览器或任何地方),然后尝试以下操作:

Date(564018060878018050) // 'Fri Nov 23 2018 06:22:20 GMT-0800 (Pacific Standard Time)'
new Date(564018060878018050) // <-- Invalid Date

我不知道为什么第一个无效,而第二个无效。还有另一种解析方法。我正试图避免为此使用图书馆。

2 个答案:

答案 0 :(得分:5)

The specs says that

  

ECMAScript Date对象支持的实际时间范围是   [...]准确–100,000,000天至100,000,000天   相对于1970年1月1日开始的午夜测量   世界标准时间。这给出了8,640,000,000,000,000毫秒的范围   1970年1月1日世界标准时间的任意时刻。

有效范围小于您使用的值(564,018,060,878,018,050)。

And deep inside the Date(value) constructor we have

  

如果abs(time)> 8.64×10 15 ,则返回NaN。

这解释了为什么new Date(564018060878018050)产生无效的日期。

As for Date(564018060878018050) the specs say that

  

...在不使用new的情况下调用构造函数的后果是   取决于构造函数。例如,Date()产生一个字符串   当前日期和时间的表示形式,而不是对象。

因此,Date(value)应该以字符串而不是日期的形式返回当前日期

> Date(564018060878018050) === (new Date()).toString()
< true

> typeof Date(564018060878018050)
< "string"

答案 1 :(得分:0)

您将Date构造函数称为Function,并在ECMAscript doc中这样说:

“当Date作为函数而不是构造函数调用时,它将返回表示当前时间(UTC)的字符串。”

注意函数调用Date(...)等效于具有相同参数的对象创建表达式new Date(...)。

您可以在此处找到更多详细信息:https://www.ecma-international.org/ecma-262/5.1/#sec-15.9.2