我有以下数据结构。第一列是间隔。间隔数据的第一行是unix时间,后续数据是间隔(即300*1、300*2等)。另一列是数据值。这是数据的头部:
a1521207300,555.45
1,554.53
2,554.07
3,553.9
4,552.67
在这里,我将 unix 时间转换为 Date
对象。这里的 a
是装饰性的,所以我将 slice()
设置为 1,如下所示:
var rawTime = data[0].interval;
var timeValue = Math.round(rawTime.slice(1));
console.log(timeValue)
console.log(new Date(timeValue))
我还尝试使用 parseInt()
而不是 round()
。控制台显示这个unix时间相当于:Jan 18 1970
,我对此大笑不已。然后我开始思考,也许我做错了什么。这应该是最近的日期——2018 年 3 月 16 日。这很奇怪,因为我的理解是 javascript 可以按照 this answer 直接传递 unix 日期。 .
我还在转换站点上检查了 UNIX 时间:www.onlineconversion.com/unix_time.htm
这证实了这确实是 2018 年 3 月 16 日的时间戳。
问题:为什么我的 2018 年 3 月数据的 Unix 日期被视为 1970 年代的日期?也许 a
毕竟实际上正在做某事......无论如何,处理这个时间戳的正确方法是什么?只有10位数字,看起来不是什么精度问题。我相信 Date
可以处理最多 13 位数字的 unix 时间。
最佳答案
根据 documentation ,当您使用整数值调用 new Date(value)
时,它将用作自 1970 年 1 月 1 日以来的毫秒数。要获取所需的日期,值 1521207300 似乎是秒数而不是毫秒数。也就是说,您错过了 1000 倍。new Date(1521207300000)
给出的是 2018 年 3 月 16 日星期五。
When I take away new from new Date it seems to be ok. Not sure why though.
文档提到了不同的行为:
Note: JavaScript Date objects can only be instantiated by calling JavaScript Date as a constructor: calling it as a regular function (i.e. without the new operator) will return a string rather than a Date object; unlike other JavaScript object types, JavaScript Date objects have no literal syntax.
当作为函数Date(value)
调用时,它似乎将值视为秒数,而不是毫秒数。我没有深入挖掘来确认这一点,因为这并不重要:文档说不要以这种方式使用它(并且由于它提供了一个字符串而不是日期对象,所以它无论如何都不是很有用)。
关于javascript - 日期处理 Unix 日期不正确(或者我错误地使用日期?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49349713/