在当前情况下,可以安全地假设所有比较日期都在同一天,因此只存储时间。
然而,很明显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);
目前,进行时间比较的代码会同步运行,但以后可能会异步,这会大大增加风险。
应该如何解决这个问题?
答案 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转换。