我需要一种始终将一整分钟添加到时间戳的方法,即使由于计划的leap秒而导致该分钟长为61秒。有谁知道moment().add(1, 'minute')
是否增加一分钟而不管leap秒?还是总是增加60秒?
我发现它在夏时制和and年期间如何处理加法,但leap秒则一无所获。
给出一些背景说明为什么这很重要:
我需要使用各种传感器的一分钟一分钟的传感器数据创建一个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>]
}
通过为第一个数据点提供小时的时间戳,并为每个后续数据点的值加上六十秒,我将其转换为一堆带有时间戳的数据(因为always秒总是在小时结束时发生,而我只做一次一次一个小时,这应该没问题)。
然后,我将需要构建一个字典,将每个时间戳映射到该分钟的值。这是必要的,这样我才能在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')
,但这可能会增加执行时间,如果可能的话,我想避免这样做。 最佳答案
您无需为此担心,因为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给出; 15年@每年365天,再加上5年@每年366天,每天24小时,每小时60分钟,每分钟60秒,每秒1000毫秒。
执行后给出的答案是“1992年3月1日11:30:00”。如果JavaScript考虑了leap秒,则将是“1992年3月1日11:30:16”,因为发生了额外的16秒(或“1992年3月1日11:29:44”取决于您的外观)。
概括地说,如果您需要知道两个日期之间实际经过了几毫秒,那么您需要编写一些代码来查询在它们跨越的时间内发生了多少leap秒(您可以找到该here的原始数据),但对于正常的时间记录,我们可以很高兴地忽略这种不受欢迎的小并发症。