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

时间:2015-01-09 00:10:44

标签: javascript momentjs

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

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

谢谢!

PS:我看了Parse ISO 8601 durationsConvert ISO 8601 time format into normal time duration

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

2 个答案:

答案 0 :(得分:36)

使用moment.duration方法, parse ISO-formatted durations开箱即用:

moment.duration('P1Y2M3DT4H5M6S')

regex is gnarly,但支持一些边缘情况并非常彻底tested

答案 1 :(得分:5)

它似乎不是支持的格式之一: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;
}

如果你测试它:

minutesFromIsoDuration(" PT120S&#34);

0

minutesFromIsoDuration(" PT5M&#34);

5

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

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])
});

接着是

result.as("minutes");