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.

21
demandé sur Community 2015-01-09 03:10:43

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é .

29
répondu bollwyvl 2016-05-27 08:13:35

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");
5
répondu Mark Dickson Jr. 2015-01-09 00:41:13