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

36

你有查看过他们的文档吗?我在那里没有看到 ISO8601 的持续时间解析 http://momentjs.com/docs/#/parsing/ - Xotic750
3个回答

56

使用 moment.duration 方法,moment 可以直接解析 ISO 格式的持续时间。例如:

parse ISO-formatted durations

moment.duration('P1Y2M3DT4H5M6S')

正则表达式很复杂,但支持许多边缘情况,并经过了相当全面的测试


1
确实如此。文档中提到的唯一事项是 duration.toJSON() 返回 ISO 格式,但它可以双向工作。 - smhg
此外,duration.toString()duration.toISOString()也返回ISO格式。 - smhg
2
这应该是最佳答案!当一个可信的库已经完成了它时,为什么要去搞正则表达式呢。 - adrianmcli
1
@qrious 请接受这个答案!这是正确的方法。使用这个库:https://github.com/jsmreese/moment-duration-format,您还可以格式化输出。 - vanthome
1
moment已被弃用。 - Nathan H
显示剩余2条评论

8

看起来这不是支持的格式之一:http://momentjs.com/docs/#/durations/

有很多github仓库可以通过正则表达式解决它(就像你提供的链接所示)。 这种方法不使用Date也可以解决。 甚至需要moment吗?

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");

0

minutesFromIsoDuration("PT5M");

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");

谢谢Mark!但我希望PT120S被读作2(2分钟)。我正在采取原始的方法,剥离PT并相应地计算分钟等价物。 - Qrious
抱歉进行了这么多次修改 - 希望您没有被垃圾邮件轰炸。 - Mark Dickson Jr.
2
从2.3.0版本开始,Moment也支持解析ISO 8601持续时间。 - Denys Vitali

-2
如果moment.js对于您的使用情况来说太重了:我已经打包了一个小型软件包来方便这个问题:
import { parse, serialize } from 'tinyduration';
 
// Basic parsing
const durationObj = parse('P1Y2M3DT4H5M6S');
assert(durationObj, {
    years: 1,
    months: 2,
    days: 3,
    hours: 4,
    minutes: 5,
    seconds: 6
});
 
// Serialization
assert(serialize(durationObj), 'P1Y2M3DT4H5M6S');
Install using npm install --save tinyduration or yarn add tinyduration

请参见:https://www.npmjs.com/package/tinyduration


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接