首页 > 解决方案 > 为什么 JavaScript Date 构造函数在这个数字上失败,但作为一种方法工作得很好

问题描述

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

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

我不知道为什么第一个有效而第二个无效。有没有其他的解析方式。我试图避免为此使用图书馆。

标签: javascripttypescriptdate

解决方案


规格说

ECMAScript Date 对象支持的实际时间范围是 [...] 精确到 –100,000,000 天到 100,000,000 天,相对于 1970 年 1 月 1 日 UTC 开始时的午夜测量。这为 1970 年 1 月 1 日 UTC 的任一侧提供了 8,640,000,000,000,000 毫秒的范围。

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

在构造函数的深处,Date(value)我们拥有

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

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

至于Date(564018060878018050)规格说

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

所以Date(value)应该将当前日期作为字符串而不是日期返回。

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

> typeof Date(564018060878018050)
< "string"

推荐阅读