web-dev-qa-db-fra.com

Comment analyser une durée au format ISO 8601 en utilisant moment.js?

J'ai une durée au format ISO 8601, par exemple: PT5M ou PT120S.

Existe-t-il un moyen de les analyser en utilisant moment.js et de récupérer le nombre de minutes spécifié dans la durée?

Je vous remercie!

PS: j'ai regardé analyser les durées ISO 8601 et convertir le format d'heure ISO 8601 en durée normale

mais tenait à savoir si cela était faisable avec le moment.

29
Qrious

moment fait analyse des durées au format ISO hors de la boîte avec le moment.duration méthode:

moment.duration('P1Y2M3DT4H5M6S')

Le regex est génial , mais prend en charge un certain nombre de cas Edge et est assez bien testé .

39
bollwyvl

Il ne semble pas être l'un des formats pris en charge: http://momentjs.com/docs/#/durations/

Il n'y a pas de pénurie de dépôts github qui le résolvent avec regex (comme vous l'avez vu, sur la base des liens que vous avez fournis). Cela le résout sans utiliser 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");

minutesFromIsoDuration ("PT5M");

5

Si vous voulez la durée logique en minutes, vous pourriez vous en sortir 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 par

result.as("minutes");
5
Mark Dickson Jr.