moment.js如何处理闰秒?

时间:2017-04-04 19:51:13

标签: javascript momentjs

我需要一种方法来始终将整分钟添加到时间戳,即使由于计划的闰秒,分钟长度为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'),但这可能会增加很多执行时间,如果可能的话我想避免使用它。

1 个答案:

答案 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),但对于正常的时间记录,我们可以很高兴地忽略这种不受欢迎的小并发症。