为什么时间戳不同?

时间:2021-03-07 14:46:37

标签: javascript json date

我得到了一个带有时间戳的 JSON 文件。

其中之一是:1545880457898

我能够通过执行以下操作获得实际日期: new Date(ticket.creationTime).toLocaleString(),它给了我:27/12/2018, 04:14:17

现在,我尝试通过以下方式转换日期:27/12/2018new Date(Number(split[2]),Number(split[1]),Number(split[0])).getTime(),并得到:1548543600000

这是非常不同的,尤其是非常大。这是一个大问题,因为我正在比较它们以按创建时间对它们进行排序。

有谁知道他们为什么不同?我怎样才能得到相当于 case1 的结果?

2 个答案:

答案 0 :(得分:2)

您的代码有几个问题:

  1. 您正在将包含小时、分钟和秒信息的时间戳转换为仅使用年、月和日的时间戳。因此,您无法重建原始时间戳,因为您丢弃了小时/分钟/秒信息。
  2. 您的输出采用 MM/DD/YYYY 格式(但这取决于您的语言环境),但是当将其拆分并将其提供给 new Date() 构造函数时,您混淆了位置的顺序参数。
  3. new Date() 构造函数使用从零开始的 monthIndex,因此您需要从从字符串中获得的月份减去 1。

请参阅下面的概念验证:

const creationTime = 1545880457898;

const dateString = new Date(creationTime).toLocaleString();

const split = dateString.split(',')[0].split('/')

const newTime = new Date(Number(split[2]),Number(split[0]) - 1,Number(split[1])).getTime();
console.log(newTime);

但是,.toLocaleString() 会产生不一致的输出(因为它依赖于语言环境),我强烈建议将 unix 时间戳解析为字符串,然后又回来了。您应该始终使用 unix 时间戳作为事实来源。 toLocaleString() 最好用于单向数据呈现(即显示日期),不应使用它来“重建”原始时间戳。

答案 1 :(得分:0)

这是因为Date api以0开始的月份为数字,在这种情况下它需要是11而不是12

new Date(Number(split[2]),Number(split[1]) - 1,Number(split[0])).getTime()

但它也不会给出准确的 1545880457898,因为我们没有提供 Date api 的时间

相关问题