web-dev-qa-db-fra.com

Obtenir la différence de temps entre deux dates-heures

Je sais que je peux faire n'importe quoi et quelques dates plus envolantes avec des moments. Mais, embarrassant, j'ai de la difficulté à essayer de faire quelque chose qui semble simple: faire la différence entre deux fois.

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" là. Je vis au Brésil, nous sommes donc 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

Donc, je suppose que ma question est: comment convertir une durée en un intervalle de temps? Je peux bien sûr utiliser

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

mais j'estime qu'il y a quelque chose de plus élégant qui me manque complètement.

mettre à jour
en 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)…}

et 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 avancée (-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 à laquelle l’heure était utilisée ... alors c’est tout.

206
Leo

Cette approche fonctionnera UNIQUEMENT si 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.

Si vous souhaitez obtenir une réponse valide pour une durée de 24 heures ou plus,}, vous devrez alors procéder de la manière suivante:

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 pouvez extraire d.minutes() et d.seconds() séparément, mais vous devez également les zéros.

Cela est nécessaire car la possibilité de formater une objection duration n'est pas actuellement dans moment.js. Il a été demandé ici . Cependant, il existe un plug-in tiers appelé moment-durée-format qui est spécifiquement 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"
305
Matt Johnson

Votre problème est de faire passer le résultat de moment.duration () dans moment () avant de le formater; il en résulte que moment () l'interprète comme une heure relative à l'époque Unix.

Il ne vous 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 êtes vraiment intéressé par ce formatage spécifique, vous devrez créer vous-même une nouvelle chaîne. Un moyen peu coûteux serait

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

var diff = moment.duration(now.diff(then)). Cela ne vous donne pas le zéro-remplissage sur les valeurs à un chiffre. Pour cela, vous voudrez peut-être envisager quelque chose comme nderscore.string - bien que cela puisse sembler être un long chemin à parcourir, pour quelques zéros supplémentaires. :)

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

Travaillé pour moi

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

53
Danilo Colasso

Si vous souhaitez une différence de deux horodatages en nombre total de jours, heures et minutes, et non en mois et en 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 de résultats en jours, heures et minutes. La solution simple est donc:

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 et 20 minutes.

27
Mahima Agrawal

Lorsque vous appelez diff, moment.js calcule la différence en millisecondes . Si les millisecondes sont passées à duration, il est utilisé pour calculer la durée qui est correcte . Cependant. lorsque vous passez les mêmes millisecondes à la moment(), il calcule la date en millisecondes à partir de (après) l'époque Epoch/unix qui est le 1er janvier 1970 (à minuit UTC/GMT) . C'est pourquoi vous obtenez 1969 comme année avec mauvaise heure.

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

Donc, je pense que c'est comme cela que vous devriez le faire puisque moment.js n'offre pas de fonction format pour la durée. Ou vous pouvez écrire un simple emballage pour le rendre plus facile/plus joli.

18
Joon

Si nous voulons seulement hh: mm: ss, nous pouvons utiliser une fonction comme celle-ci:

//param: duration in milliseconds
MillisecondsToTime: function(duration) {
    var seconds = parseInt((duration/1000)%60)
        , minutes = parseInt((duration/(1000*60))%60)
        , hours = parseInt((duration/(1000*60*60))%24)
        , days  = parseInt(duration/(1000*60*60*24));

    var hoursDays = parseInt(days*24);
    hours += hoursDays;
    hours = (hours < 10) ? "0" + hours : hours;
    minutes = (minutes < 10) ? "0" + minutes : minutes;
    seconds = (seconds < 10) ? "0" + seconds : seconds;
    return hours + ":" + minutes + ":" + seconds;
}
9
Filipe Eusébio

Cela devrait bien fonctionner. 

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);

console.log(d.days(), d.hours(), d.minutes(), d.seconds());
6
Manzurul

Au lieu de 

Math.floor(duration.asHours()) + moment.utc(duration.asMilliseconds()).format(":mm:ss")

Il vaut mieux faire

moment.utc(total.asMilliseconds()).format("HH:mm:ss");
3
robinvdvleuten

Utilisez ceci,

  var duration = moment.duration(endDate.diff(startDate));

    var aa = duration.asHours();
1
Abdus Salam Azad

ENTREE BASEE SUR LA DATE  

    var dt1 = new Date("2019-1-8 11:19:16");
    var dt2 = new Date("2019-1-8 11:24:16");


    var diff =(dt2.getTime() - dt1.getTime()) ;
    var hours = Math.floor(diff / (1000 * 60 * 60));
    diff -= hours * (1000 * 60 * 60);
    var mins = Math.floor(diff / (1000 * 60));
    diff -= mins * (1000 * 60);


    var response = {
        status : 200,
        Hour : hours,
        Mins : mins
    }

SORTIE

{
"status": 200,
"Hour": 0,
"Mins": 5
}
0
Anandan K

Je crée une fonction simple avec TypeScript

const diffDuration: moment.Duration = moment.duration(moment('2017-09-04 12:55').diff(moment('2017-09-02 13:26')));
setDiffTimeString(diffDuration);

function setDiffTimeString(diffDuration: moment.Duration) {
  const str = [];
  diffDuration.years() > 0 ? str.Push(`${diffDuration.years()} year(s)`) : null;
  diffDuration.months() > 0 ? str.Push(`${diffDuration.months()} month(s)`) : null;
  diffDuration.days() > 0 ? str.Push(`${diffDuration.days()} day(s)`) : null;
  diffDuration.hours() > 0 ? str.Push(`${diffDuration.hours()} hour(s)`) : null;
  diffDuration.minutes() > 0 ? str.Push(`${diffDuration.minutes()} minute(s)`) : null;
  console.log(str.join(', '));
} 
// output: 1 day(s), 23 hour(s), 29 minute(s)

pour générer javascript https://www.typescriptlang.org/play/index.html

0
Serkan KONAKCI

Dans ES8, utilisez moment, maintenant et commencez à être des objets moment.

const duration = moment.duration(now.diff(start));
const timespan = duration.get("hours").toString().padStart(2, '0') +":"+ duration.get("minutes").toString().padStart(2, '0') +":"+ duration.get("seconds").toString().padStart(2, '0');
0
Fernando Rossato

InTime = 06: 38, Outtime = 15: 40

 calTimeDifference(){
        this.start = dailyattendance.InTime.split(":");
        this.end = dailyattendance.OutTime.split(":");
        var time1 = ((parseInt(this.start[0]) * 60) + parseInt(this.start[1]))
        var time2 = ((parseInt(this.end[0]) * 60) + parseInt(this.end[1]));
        var time3 = ((time2 - time1) / 60);
        var timeHr = parseInt(""+time3);
        var  timeMin = ((time2 - time1) % 60);
    }
0
Sanket Parchande