Moment.js中的安全时间比较

时间:2016-12-01 13:36:05

标签: javascript momentjs

在当前情况下,可以安全地假设所有比较日期都在同一天,因此只存储时间。

然而,很明显Y2K样问题存在非零概率。

这条代码在00:00(粗略地)执行时可能会失败,如果在一天的23:59:59.999评估momentTimeA行,并且在00:00评估momentTimeB行:00.000另一天:

// timeA is '06:00:00', momentTimeA is '2016-11-11T06:00:00.000';
const momentTimeA = moment(timeA, 'H:mm:ss');

// ...

// timeB is '03:00:00', momentTimeB is '2016-11-12T03:00:00.000';
const momentTimeB = moment(timeB, 'H:mm:ss');

// should be positive
momentTimeA.diff(momentTimeB);

目前,进行时间比较的代码会同步运行,但以后可能会异步,这会大大增加风险。

应该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

由于您正在处理可能跨越午夜的时间范围,并且您没有考虑日期,因此您需要自行检测并进行调整。

// your inputs
var timeA = '06:00:00';
var timeB = '03:00:00';

// today's date as a string
var today = moment().format('YYYY-MM-DD');

// both moments created using the same date
var momentTimeA = moment(today + ' ' + timeA, 'YYYY-MM-DD H:mm:ss');
var momentTimeB = moment(today + ' ' + timeB, 'YYYY-MM-DD H:mm:ss');

// check if midnight is crossed
if (momentTimeA.isAfter(momentTimeB)) {

    // move A back a day  (this is an assumption!)
    var yesterday = moment().subtract(1, 'day').format('YYYY-MM-DD');
    momentTimeA = moment(yesterday + ' ' + timeA, 'YYYY-MM-DD H:mm:ss');
}

// now you can take the difference
var delta = momentTimeB.diff(momentTimeA);

请注意,您的原始差异中A和B相反。假设A首先出现,请使用B.diff(A)获得肯定的结果。

另外,请注意,在上面的代码中,重要的是您不要只是从一天中减去一天来调整它,而是在给定时间重新创建昨天的新时刻。这是因为您正在本地时间工作,这可能会在其中一个时间内进行DST转换。