我得到了一个带有时间戳的 JSON 文件。
其中之一是:1545880457898
我能够通过执行以下操作获得实际日期:
new Date(ticket.creationTime).toLocaleString()
,它给了我:27/12/2018, 04:14:17
。
现在,我尝试通过以下方式转换日期:27/12/2018
:
new Date(Number(split[2]),Number(split[1]),Number(split[0])).getTime()
,并得到:1548543600000
。
这是非常不同的,尤其是非常大。这是一个大问题,因为我正在比较它们以按创建时间对它们进行排序。
有谁知道他们为什么不同?我怎样才能得到相当于 case1 的结果?
答案 0 :(得分:2)
您的代码有几个问题:
MM/DD/YYYY
格式(但这取决于您的语言环境),但是当将其拆分并将其提供给 new Date()
构造函数时,您混淆了位置的顺序参数。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 的时间