Comment puis-je analyser une durée formatée ISO 8601 en utilisant le moment.js?
j'ai une durée formatée ISO 8601, par exemple: PT5M ou PT120S.
y a-t-il un moyen pour que je puisse les analyser en utilisant le moment.js et extraire le nombre de minutes spécifié dans la durée?
Merci!
PS: j'ai regardé Parse ISO 8601 durées et convertissent le format de temps ISO 8601 en durée de temps normale
mais voulait savoir si c'était faire-mesure avec moment.
2 réponses
moment does parse ISO-formated durations sortie de la boîte avec la méthode moment.duration
:
moment.duration('P1Y2M3DT4H5M6S')
le regex est gnarly , mais soutient un certain nombre de cas de bord et est assez minutieusement testé .
il ne semble pas être un des formats pris en charge: http://momentjs.com/docs/#/durations /
il n'y a pas de pénurie de repos github qui le résolvent avec regex (comme vous l'avez vu, basé sur les liens que vous avez fournis). Ceci le résout sans utiliser la Date. Y a-t-il même un besoin de 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;
}
si vous le testez:
minutesFromIsoDuration ("PT120S");
0
minutesFromIsoDuration ("PT5M");
5
si vous voulez la durée logique en minutes, vous pourriez vous en tirer avec:
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])
});
suivi de
result.as("minutes");