我需要一种始终将一整分钟添加到时间戳的方法,即使由于计划的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的原始数据),但对于正常的时间记录,我们可以很高兴地忽略这种不受欢迎的小并发症。

09-28 03:07