我需要一种方法来始终将整分钟添加到时间戳,即使由于计划的闰秒,分钟长度为61秒。有没有人知道moment().add(1, 'minute')
是否会增加一分钟而不管闰秒?或者它总是添加六十秒?
我已经发现它如何处理夏令时和闰年的增加,但是没有什么可以用于闰秒。
给出一些重要原因:
我需要创建一个CSV文件,其中包含一系列用于各种传感器的每分钟传感器数据,格式如下:
time,sensor1,sensor2
1491329921800,20,21
1491329981800,22,21
我的数据与一小时开始的时间戳一起存储,然后是一小时的60个数据点的数组。
{
timestamp: Date(2017,2,24,12,0,0),
temperature: [20, 22, 23, ... <60 elements total>]
}
我把它变成一堆时间戳数据,给第一个数据点一小时的时间戳,并为每个后续数据点加上60秒(因为闰秒总是发生在一小时结束时我只一次做一个小时,这应该没问题。
然后我需要构建一个字典,将每个时间戳映射到该分钟的值。这是必要的,这样我就可以在CSV的右行中获得正确的数据;传感器可能已经在不同时间启动,或者可能已经关闭了一小时或者在一小时的某个时间段内没有报告;我不能只假设所有传感器都有相同的数据。
我找到了使用以下代码创建CSV的所有时间戳:
var date = moment(startDate);
var end = endDate.getTime();
var timestamps = [];
while(date.valueOf() < end) {
timestamps.push(date.valueOf());
date.add(1, 'minute')
}
timestamps.push(date.valueOf());
但我不确定它是否安全。如果我需要,我可以将date.add(1, 'minute')
更改为date.add(1, 'minute').startOf('minute')
,但这可能会增加很多执行时间,如果可能的话我想避免使用它。
答案 0 :(得分:2)
您不必为此担心,因为JavaScript不会意识到leap秒。考虑这段代码:-
var newDate = new Date('1 March 1972 11:30:00');
//Convert to milliseconds and add 20 years
var msec = Date.parse(newDate) + 631152000000;
//Convert milliseconds back to normal date format
newDate = new Date(msec);
第二行的大数字是20年的毫秒数,由公式((15 x 365)+(5 x 366))x 24 x 60 x 60 x 1000给出;每年365天,每年15年,每年366天,每天24小时,每小时60分钟,每分钟60秒,每秒1000毫秒,再加上5年@每年。
执行后给出的答案是“ 1992年3月1日11:30:00”。如果JavaScript考虑了leap秒,则将是“ 1992年3月1日11:30:16”,因为发生了额外的16秒(或“ 1992年3月1日11:29:44”取决于您的外观)。>
总而言之,如果您需要知道两个日期之间实际经过了几毫秒,那么您需要编写一些代码来查询在它们跨越的时间内发生了多少leap秒(您可以找到原始数据) here),但对于正常的时间记录,我们可以很高兴地忽略这种不受欢迎的小并发症。