我正在使用momentjs来检查火车旅行的两个时间戳之间的分钟差异。 我用来从24小时格式中获取数据的API返回时间(momentjs:HH:mm:ss)。
如果旅行继续到第二天,则时间显示为例如" 24:12:00"这很奇怪。 Momentjs无法解决这个问题,如果我尝试用这些值来计算时差,我会得到" NaN"。
所以我创建了一个转换任何" 24"发生在" 00"。
function maintainHour (timeString) {
var splitted = timeString.split(':');
if(splitted[0] == '24') {
splitted[0] = '00';
}
return splitted[0] + ':' + splitted[1] + ':' + splitted[2];
}
如果我使用diff()
函数检查一个时间戳和时间戳之间的差异,该时间戳有" 00"作为小时,我不能区分它是当天或第二天的时间戳。因此,如果当前时间为16:00(意味着当天上午),而不是在即将到来的一天24小时之前的正X分钟,那么差异将是-900左右。
知道怎么处理这个吗?
答案 0 :(得分:3)
因为你只处理一段时间,所以你会遇到这样的问题。当你只处理一段时间时,时刻假定当前解析时。当然,当您将这些小时数设置为零时,您会遇到您所描述的问题 - 结束时间早于开始时间。
这是不直观的,但我实际上可能会使用'溢出'设置解决此问题的能力。
当您将值传递给时刻设置函数(.hours()
,.minutes()
等)时,如果该值超出允许范围,它将溢出到下一个单位。你可以在这里使用它。拆分较晚的时间(可能具有24的那个),就像你一样。然后做这样的事情:
moment.utc('2016-01-01')
.set({hours:splitted[0], minutes:splitted[1], seconds:splitted[2]}).format()
作为发生事情的具体例子:
moment.utc('2016-01-01').set({hours:24, minutes:32, seconds:12}).format()
"2016-01-02T00:32:12Z"
正如你所看到的那样,24把它推到了第二天。
听起来你所拥有的只是时代,而不是日期。如果这是正确的,那么我强烈建议选择一个任意日期作为您的解析日期,并使用UTC模式作为您的时刻。
如果您在本地模式下使用具有任意日期的时刻,则可能会遇到因DST转换而导致差异不符合您的问题。在UTC模式下,那些不会发生。
值得注意的是,相反,如果你知道日期,你应该使用它,并在正确的时区(如有必要,使用时刻时区),这样你就可以捕捉可能导致数小时差异的DST过渡在两次之间变化。
此外,手动设置日期可避免可能的竞争条件,其中第一次调用时刻落在与第二次调用时刻不同的日期。这是一个以后很难找到的错误。