Moment.js 24小时时间格式,处理24小时

我正在使用momentjs来检查火车旅行的两个时间戳之间的分钟差异。 我使用的API以24小时制格式返回数据(momentjs:HH:mm:ss)。

如果旅程继续到第二天,则时间显示为例如“24:12:00”,这很奇怪。 Momentjs无法处理这个问题,如果我尝试用这些值来计算时间差异,我会得到“NaN”。

所以我创build了一个函数将任何“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”小时的时间戳之间的差异,我不能区分它是当前date还是第二天的时间戳。 因此,如果当前时间是16:00(例如今天上午),而不是正X分钟,直到即将到来的一天的24小时,那么差异将在-900左右。

任何想法如何处理这个?

因为你正在处理一段时间,你会遇到这样的问题。 当你处理一段时间的时候,时刻就是当前分析的那一天。 当然,当你将这些时间设置回零时,你会遇到你所描述的问题 – 结束时间比开始时间早。

这是不直观的,但我可能实际上使用set的“溢出”function来解决这个问题。

当你将一个值传递给一个时间集函数( .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日将它推向第二天。

这听起来像你在这里所有的是时间,而不是date。 如果这是正确的,那么我强烈build议select一个任意的date作为你的parsingdate,并使用UTC模式为你的时刻。

如果以任意date的本地模式使用时间,则可能会遇到由于DST转换而导致差异不符合预期的问题。 在UTC模式下,这些不会发生。

值得注意的是,相反,如果你知道date,你应该使用它,并在正确的时区(如果需要的话,有时间的时区),以便捕获可能导致小时差异的DST转换同样的两次。

另外,手动设置date避免了第一次调用时刻的地点与第二次调用时间不同的可能的竞争条件。 这是一个以后很难find的bug。