【问题标题】:Moment.js 24-hour time format, dealing with the 24th hourMoment.js 24 小时制时间格式,处理 24 小时制
【发布时间】:2016-04-23 13:31:51
【问题描述】:

我正在使用 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(例如今天的早上),则差异将在 -900 左右,而不是到下一天的 24 小时前的正 X 分钟。

知道如何处理吗?

【问题讨论】:

    标签: javascript node.js datetime momentjs


    【解决方案1】:

    因为你只处理一次,你会遇到这样的问题。当您只处理一个时间时,解析时会假定当前日期。当然,当您将这些小时数设置为零时,您会遇到您所描述的问题 - 结束时间早于开始时间。

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

    当您将值传递给矩集函数(.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 转换在相同的两次之间变化。

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

    【讨论】:

    • 我一定会试一试的。
    猜你喜欢
    • 2012-10-09
    • 1970-01-01
    • 2016-02-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    • 2023-04-08
    • 2014-11-20
    • 1970-01-01
    相关资源
    最近更新 更多