javascript - 为什么 JavaScript Date 构造函数在这个数字上失败,但作为一种方法工作得很好
问题描述
老实说,我不确定如何表达这个问题。基本上打开一个 JavaScript 控制台(节点、您的浏览器或任何地方)并尝试以下操作:
Date(564018060878018050) // 'Fri Nov 23 2018 06:22:20 GMT-0800 (Pacific Standard Time)'
new Date(564018060878018050) // <-- Invalid Date
我不知道为什么第一个有效而第二个无效。有没有其他的解析方式。我试图避免为此使用图书馆。
解决方案
规格说:
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)。
如果 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"
推荐阅读
- c++ - 如何将对象写入文件,并在 C++ 中从中读取?
- laravel - 如何构建多个仪表板?
- c++ - 在 CWinApp 中 m_pMainWnd 为 NULL,因为未调用 InitInstance
- c++ - 如果范围没有排序,inplace_merge 会做什么?
- c++ - 未定义的参考在 arm chromebook 上编译 taskwarrior
- json - 在Angular中使用httpclient服务加载本地json异步
- javascript - 在 VueJS 中将组件作为道具传递时出现未知的自定义元素错误
- angular - 构建后如何使用href修复离子路由?
- c++ - 输出混乱
- javascript - 悬停在带有 textarea 的 div 元素上不起作用