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

时间:2016-04-23 13:31:51

标签: javascript node.js datetime momentjs

我正在使用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左右。

知道怎么处理这个吗?

1 个答案:

答案 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过渡在两次之间变化。

此外,手动设置日期可避免可能的竞争条件,其中第一次调用时刻落在与第二次调用时刻不同的日期。这是一个以后很难找到的错误。