新的Date()返回无效日期除非* by 1?

时间:2018-03-20 12:53:49

标签: javascript datetime unix-timestamp

我有一个JSON对象返回内容片段发布日期的unix时间戳。使用.toISOString()时,此时间戳作为无效日期返回,除非我将其乘以1.

作为一个例子

let timestamp = item[index].date; // returns string of "1584632700000"
let invalidDate = new Date(timestamp).toISOString(); // returns invalid Date
let validDate = new Date(timestamp * 1).toISOString(); // returns valid (and correct) Date

这背后的原因是什么?

1 个答案:

答案 0 :(得分:2)

背后的原因是 new Date 如何解释其论点。

查看我们看到的相关原型:

  

新日期(价值)

     

新日期(dateString)

value是一个数字,dateString是一个字符串。

这意味着当传递字符串和数字时,函数的作用会有所不同。

MDN将

value描述为:

  

整数值,表示自1970年1月1日00:00:00 UTC以来的毫秒数,忽略闰秒(Unix Epoch;但考虑到大多数Unix时间戳函数以秒为单位计算)。

并且dateString为:

  

表示日期的字符串值。该字符串应采用Date.parse()方法识别的格式(符合IETF的RFC 2822时间戳以及ISO8601的版本)。

由于您传递了一个字符串,它将使用第二方法尝试解析日期。

现在,为什么它适用于* 1

* 1正在以隐式方式将字符串转换为数字。

您也可以使用 parseInt 执行此操作,这有点冗长:

new Date(parseInt('1584632700000', 10))