286 votes

Obtenir la différence de temps entre deux dates

Je sais que je peux faire n'importe quoi et d'autres choses concernant les dates avec momentjs. Mais malheureusement, j'ai du mal à faire quelque chose qui semble simple : obtenir la différence entre 2 temps.

Exemple :

var now  = "04/09/2013 15:00:00";
var then = "04/09/2013 14:20:30";

//expected result:
"00:39:30"

ce que j'ai essayé :

var now = moment("04/09/2013 15:00:00");
var then = moment("04/09/2013 14:20:30");

console.log(moment(moment.duration(now.diff(then))).format("hh:mm:ss"))
//outputs 10:39:30  

Je ne comprends pas ce qu'est ce "10". Je vis au Brésil, nous sommes donc en utc-0300 si cela est pertinent.

Le résultat de moment.duration(now.diff(then)) est une durée avec les valeurs internes correctes :

 days: 0
 hours: 0
 milliseconds: 0
 minutes: 39
 months: 0
 seconds: 30
 years: 0

Ma question est donc la suivante : comment convertir un momentjs Duration en un intervalle de temps ? Je peux bien sûr utiliser

duration.get("hours") +":"+ duration.get("minutes") +:+ duration.get("seconds")

mais j'ai le sentiment qu'il y a quelque chose de plus élégant qui m'échappe complètement.

mise à jour
En y regardant de plus près, dans l'exemple ci-dessus now est :

Tue Apr 09 2013 15:00:00 GMT-0300 (E. South America Standard Time)…}

y moment(moment.duration(now.diff(then))) est :

Wed Dec 31 1969 22:39:30 GMT-0200 (E. South America Daylight Time)…}

Je ne sais pas pourquoi la deuxième valeur est en heure d'été (-0200)... mais je suis sûr que je n'aime pas les dates :(

mise à jour 2

Eh bien, la valeur est -0200 probablement parce que le 31/12/1969 était une date où l'on utilisait l'heure d'été... c'est donc ça.

422voto

Matt Johnson Points 33433

Cette approche fonctionne UNIQUEMENT lorsque la durée totale est inférieure à 24 heures :

var now  = "04/09/2013 15:00:00";
var then = "04/09/2013 14:20:30";

moment.utc(moment(now,"DD/MM/YYYY HH:mm:ss").diff(moment(then,"DD/MM/YYYY HH:mm:ss"))).format("HH:mm:ss")

// outputs: "00:39:30"

Si vous avez 24 heures ou plus, les heures seront remises à zéro avec l'approche ci-dessus, ce qui n'est pas idéal.

Si vous souhaitez obtenir une réponse valide pour des durées de 24 heures ou plus, vous devrez alors faire quelque chose comme ceci :

var now  = "04/09/2013 15:00:00";
var then = "02/09/2013 14:20:30";

var ms = moment(now,"DD/MM/YYYY HH:mm:ss").diff(moment(then,"DD/MM/YYYY HH:mm:ss"));
var d = moment.duration(ms);
var s = Math.floor(d.asHours()) + moment.utc(ms).format(":mm:ss");

// outputs: "48:39:30"

Notez que j'utilise l'heure utc comme raccourci. Vous pourriez sortir d.minutes() y d.seconds() séparément, mais il faudrait aussi les zoner.

Cela est nécessaire parce que la capacité de formater un duration L'objection n'est pas actuellement dans moment.js. Elle a été demandée ici . Cependant, il existe un plugin tiers appelé moment-duration-format qui est spécialement conçu à cet effet :

var now  = "04/09/2013 15:00:00";
var then = "02/09/2013 14:20:30";

var ms = moment(now,"DD/MM/YYYY HH:mm:ss").diff(moment(then,"DD/MM/YYYY HH:mm:ss"));
var d = moment.duration(ms);
var s = d.format("hh:mm:ss");

// outputs: "48:39:30"

76voto

TML Points 6469

Votre problème est de renvoyer le résultat de moment.duration() dans moment() avant de le formater, ce qui fait que moment() l'interprète comme un temps relatif à l'époque Unix.

Cela ne donne pas exactement le format que vous recherchez, mais

moment.duration(now.diff(then)).humanize()

vous donnerait un format utile comme "40 minutes". Si vous tenez vraiment à ce formatage spécifique, vous devrez créer vous-même une nouvelle chaîne de caractères. Une méthode peu coûteuse consisterait à

[diff.asHours(), diff.minutes(), diff.seconds()].join(':')

var diff = moment.duration(now.diff(then)) . Cela ne vous permet pas d'ajouter des zéros aux valeurs à un chiffre. Pour cela, vous pouvez envisager quelque chose comme souligné.chaîne.de.caractères - bien que cela semble être un long chemin à parcourir juste pour quelques zéros supplémentaires :)

72voto

Danilo Colasso Points 1664
var a = moment([2007, 0, 29]);
var b = moment([2007, 0, 28]);
a.diff(b, 'days') //[days, years, months, seconds, ...]
//Result 1 

Cela a fonctionné pour moi

Voir plus dans http://momentjs.com/docs/#/displaying/difference/

36voto

Mahima Agrawal Points 523

Si vous souhaitez faire la différence entre deux horodatages en jours, heures et minutes seulement, et non en mois et années.

var now  = "01/08/2016 15:00:00";
var then = "04/02/2016 14:20:30";
var diff = moment.duration(moment(then).diff(moment(now)));

diff contient 2 mois, 23 jours, 23 heures et 20 minutes. Mais nous n'avons besoin que du résultat en jours, heures et minutes, donc la solution simple est la suivante :

var days = parseInt(diff.asDays()); //84

var hours = parseInt(diff.asHours()); //2039 hours, but it gives total hours in given miliseconds which is not expacted.

hours = hours - days*24;  // 23 hours

var minutes = parseInt(diff.asMinutes()); //122360 minutes,but it gives total minutes in given miliseconds which is not expacted.

minutes = minutes - (days*24*60 + hours*60); //20 minutes.

Le résultat final sera : 84 jours, 23 heures, 20 minutes.

20voto

Joon Points 1132

Lorsque vous appelez diff moment.js calcule la différence en millisecondes. Si le nombre de millisecondes est passé à duration Il est utilisé pour calculer la durée, ce qui est correct. Cependant, lorsque vous passez les mêmes millisecondes à la fonction moment() Il calcule la date à quelques millisecondes de (après) l'heure epoch/unix du 1er janvier 1970 (minuit UTC/GMT). C'est pourquoi vous obtenez 1969 comme année ainsi qu'une heure erronée.

duration.get("hours") +":"+ duration.get("minutes") +":"+ duration.get("seconds")

Je pense donc que c'est ainsi qu'il faut procéder puisque moment.js ne propose pas de fonction format pour la durée. Vous pouvez aussi écrire un simple wrapper pour faciliter les choses.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X