如何使用moment.js解析ISO 8601格式的持续时间?

Qri*_*ous 29 javascript momentjs

我有ISO 8601格式的持续时间,例如:PT5M或PT120S.

有什么方法可以使用moment.js解析这些并获取持续时间中指定的分钟数吗?

谢谢!

PS:我查看了Parse ISO 8601持续时间 并将ISO 8601时间格式转换为正常持续时间

但是很想知道这是否可以随时使用.

小智 42

时刻确实 使用以下方法解析ISO格式的持续时间moment.duration:

moment.duration('P1Y2M3DT4H5M6S')
Run Code Online (Sandbox Code Playgroud)

正则表达式是粗糙的,但支持了一些边缘的情况下,倒也彻底测试.

  • 这应该是最重要的答案!当受信任的库已经这样做时,为什么要搞乱正则表达式呢? (2认同)

Mar*_*Jr. 6

它似乎不是受支持的格式之一:http://momentjs.com/docs/#/durations/

使用正则表达式来解决它的github repos并不缺乏(正如您所看到的,基于您提供的链接).这解决了它而不使用日期.甚至还需要片刻吗?

var regex = /P((([0-9]*\.?[0-9]*)Y)?(([0-9]*\.?[0-9]*)M)?(([0-9]*\.?[0-9]*)W)?(([0-9]*\.?[0-9]*)D)?)?(T(([0-9]*\.?[0-9]*)H)?(([0-9]*\.?[0-9]*)M)?(([0-9]*\.?[0-9]*)S)?)?/

minutesFromIsoDuration = function(duration) {
    var matches = duration.match(regex);

    return parseFloat(matches[14]) || 0;
}
Run Code Online (Sandbox Code Playgroud)

如果你测试它:

minutesFromIsoDuration( "PT120S");

0

minutesFromIsoDuration( "PT5M");

如果你想要几分钟的逻辑持续时间,你可能会逃避:

return moment.duration({
    years: parseFloat(matches[3]),
    months: parseFloat(matches[5]),
    weeks: parseFloat(matches[7]),
    days: parseFloat(matches[9]),
    hours: parseFloat(matches[12]),
    minutes: parseFloat(matches[14]),
    seconds: parseFloat(matches[16])
});
Run Code Online (Sandbox Code Playgroud)

其次是

result.as("minutes");
Run Code Online (Sandbox Code Playgroud)

  • 从 2.3.0 开始,moment 还支持解析 ISO 8601 持续时间。 (2认同)