我有一个ISO 8601格式的时间段,例如: PT5M 或 PT120S。
是否有办法使用moment.js解析这些时间段,并获取指定时间段内的分钟数?
谢谢!
PS: 我查看了解析ISO 8601时间段和将ISO 8601时间格式转换为正常时间段
但我很想知道是否可以使用moment完成。
我有一个ISO 8601格式的时间段,例如: PT5M 或 PT120S。
是否有办法使用moment.js解析这些时间段,并获取指定时间段内的分钟数?
谢谢!
PS: 我查看了解析ISO 8601时间段和将ISO 8601时间格式转换为正常时间段
但我很想知道是否可以使用moment完成。
使用 moment.duration
方法,moment 可以直接解析 ISO 格式的持续时间。例如:
moment.duration('P1Y2M3DT4H5M6S')
duration.toJSON()
返回 ISO 格式,但它可以双向工作。 - smhgduration.toString()
和duration.toISOString()
也返回ISO格式。 - smhg看起来这不是支持的格式之一: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");
PT120S
被读作2
(2分钟)。我正在采取原始的方法,剥离PT
并相应地计算分钟等价物。 - Qriousimport { 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