Obtenez la différence d'heures entre deux dates dans Moment Js


386

Je peux obtenir la différence entre deux dates en utilisant MomentJs comme suit:

moment(end.diff(startTime)).format("m[m] s[s]")

Cependant, je souhaite également afficher l'heure le cas échéant (uniquement lorsque> = 60 minutes se sont écoulées).

Cependant, lorsque j'essaie de récupérer les heures de durée en utilisant ce qui suit:

var duration = moment.duration(end.diff(startTime));
var hours = duration.hours();

il renvoie l'heure actuelle et non le nombre d'heures entre les deux dates.

Comment puis-je obtenir la différence d'heures entre deux moments?

Réponses:


613

Tu étais proche. Il vous suffit d'utiliser la duration.asHours()méthode (voir la documentation ).

var duration = moment.duration(end.diff(startTime));
var hours = duration.asHours();

8
N'est-ce pas startTime.diff(end, 'hours', true);? La durée en heures (); retournerait 1 si c'était il y a 25 heures.
Daniel F

29
@DanielF Si vous utilisez MomentJS> = version 2.0.0, vous pouvez utiliser .diff(), oui. Sauf que ce serait end.diff(startTime, 'hours', true)d'obtenir le nombre d'heures comme un nombre positif. Cependant, votre deuxième point n'est pas correct. duration.hours()retournerait 1 si c'était il y a 25 heures, mais duration.asHours()reviendrait 25.
GregL

5
@GregL Je corrige jsfiddle.net/qxxr1Lyr J'ai dû utiliser par erreur la .hours()méthode sans m'en rendre compte.
Daniel F

5
Comment cela a-t-il autant de votes quand tout ce qu'il fait est de faire connaître au PO une faute de frappe que la plupart des IDE vous révéleraient de toute façon ( imgur.com/a/ikyayIL ). SO rep est d'abord le mieux habillé tandis que d'autres travaillent pour les restes smh. Oh vous avez corrigé une faute de frappe .. voici 4.7k rep
zanderwar

3
@zanderwar Je comprends votre frustration, mais c'est une question vieille de 5 ans. Aujourd'hui, de telles questions et réponses ne volaient pas.
Jean-François Fabre

220

Le bloc de code suivant montre comment calculer la différence de nombre de jours entre deux dates à l'aide de MomentJS.

var now = moment(new Date()); //todays date
var end = moment("2015-12-1"); // another date
var duration = moment.duration(now.diff(end));
var days = duration.asDays();
console.log(days)

62
Au moins, son bloc de code montrait toutes les variables qui étaient utilisées contrairement à la réponse acceptée ou à la question. Si quelqu'un veut voter contre, il devrait voter contre la question, car il s'agit d'un bloc de code incomplet pour commencer. Ce bloc de code a-t-il vraiment besoin d'explications?
Jordan Papaleo

23
Cette réponse est assez claire et encore plus complète pour moi que la réponse acceptée ci-dessus, où vous ne savez pas d'où viennent «end» et «startTime» ... Merci beaucoup pour votre réponse Raj!
Pierre

3
C'est un peu plus simple de s'en sortir maintenant var now = moment();. Voir momentjs.com/docs/#/parsing/now
rob3c

161

Ou vous pouvez faire simplement:

var a = moment('2016-06-06T21:03:55');//now
var b = moment('2016-05-06T20:03:55');

console.log(a.diff(b, 'minutes')) // 44700
console.log(a.diff(b, 'hours')) // 745
console.log(a.diff(b, 'days')) // 31
console.log(a.diff(b, 'weeks')) // 4

docs: ici


12
Comment afficher toutes les heures, minutes et secondes ensemble? Comme HH: MM: SS?
Faizan Saiyed

16

Tout ce que vous avez à faire est de passer en hourstant que deuxième paramètre à la fonction de différence des moments.

var a = moment([21,30,00], "HH:mm:ss")
var b = moment([09,30,00], "HH:mm:ss")
a.diff(b, 'hours') // 12

Documents: https://momentjs.com/docs/#/displaying/difference/

Exemple:

const dateFormat = "YYYY-MM-DD HH:mm:ss";
// Get your start and end date/times
const rightNow = moment().format(dateFormat);
const thisTimeYesterday = moment().subtract(1, 'days').format(dateFormat);
// pass in hours as the second parameter to the diff function
const differenceInHours = moment(rightNow).diff(thisTimeYesterday, 'hours');

console.log(`${differenceInHours} hours have passed since this time yesterday`);
<script 
  src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.20.1/moment.min.js">
</script>


12

Il existe une excellente momentméthode appelée fromNow()qui retournera l'heure à partir d'une heure spécifique sous une belle forme lisible par l'homme, comme ceci:

moment('2019-04-30T07:30:53.000Z').fromNow() // an hour ago || a day ago || 10 days ago

Ou si vous le souhaitez entre deux dates spécifiques, vous pouvez utiliser:

var a = moment([2007, 0, 28]);
var b = moment([2007, 0, 29]);
a.from(b); // "a day ago"

Tiré des documents:


7

Je sais que c'est vieux, mais voici une solution à un revêtement:

const hourDiff = start.diff(end, "hours");

début et fin sont des objets moments.

Prendre plaisir!


... déjà proposé par Sebastián Lara en 2016
YakovL

2
 var start=moment(1541243900000);
 var end=moment(1541243942882);
 var duration = moment.duration(end.diff(startTime));
 var hours = duration.asHours();

Comme vous pouvez le voir, les dates de début et de fin devaient être des objets de moment pour que cette méthode fonctionne.


2
Bien que ce code puisse répondre à la question, fournir un contexte supplémentaire sur la manière et la raison pour laquelle il résout le problème améliorerait la valeur à long terme de la réponse.
Alexander

1
var __startTime = moment("2016-06-06T09:00").format();
var __endTime = moment("2016-06-06T21:00").format();

var __duration = moment.duration(moment(__endTime).diff(__startTime));
var __hours = __duration.asHours();
console.log(__hours);

2
Supprimez toutes les conversions inutiles de / en représentations de chaîne de moments et vous vous retrouverez avec la réponse acceptée.
Vladimir M

1
Pourquoi les soulignements supplémentaires au début des noms de variables?
zenw0lf

1

Dans mon cas, je voulais des heures et des minutes:

var duration = moment.duration(end.diff(startTime));
var hours = duration.hours(); //hours instead of asHours
var minutes = duration.minutes(); //minutes instead of asMinutes

Pour plus d'informations, reportez-vous aux documents officiels .


0

Si vous voulez un total de minutes entre deux dates par jour que mai ci-dessous, le code vous aidera pleinement Date de début: 2018-05-04 02:08:05 , date de fin: 2018-05-14 09:04:07 ...

function countDaysAndTimes(startDate,endDate){
return new Promise(function (resolve, reject) {
var dayObj = new Object;
var finalArray = new Array;

var datetime1 = moment(startDate);
var datetime2 = moment(endDate);
if(datetime1.format('D') != datetime2.format('D') || datetime1.format('M') != datetime2.format('M') ||  datetime1.format('YYYY') != datetime2.format('YYYY')){
  var onlyDate1 = startDate.split(" ");
  var onlyDate2 = endDate.split(" ");
  var totalDays = moment(onlyDate2[0]).diff(moment(onlyDate1[0]), 'days')

  // First Day Entry
  dayObj.startDate = startDate;
  dayObj.endDate = moment(onlyDate1[0]).add(1, 'day').format('YYYY-MM-DD')+" 00:00:00";
  dayObj.minutes = moment(dayObj.endDate).diff(moment(dayObj.startDate), 'minutes');
  finalArray.push(dayObj);

  // Between Days Entry
  var i = 1;
  if(totalDays > 1){
    for(i=1; i<totalDays; i++){
      var dayObj1 = new Object;
      dayObj1.startDate = moment(onlyDate1[0]).add(i, 'day').format('YYYY-MM-DD')+" 00:00:00";
      dayObj1.endDate = moment(onlyDate1[0]).add(i+1, 'day').format('YYYY-MM-DD')+" 00:00:00";
      dayObj1.minutes = moment(dayObj1.endDate).diff(moment(dayObj1.startDate), 'minutes');
      finalArray.push(dayObj1);
    }
  }

  // Last Day Entry
  var dayObj2 = new Object;
  dayObj2.startDate = moment(onlyDate1[0]).add(i, 'day').format('YYYY-MM-DD')+" 00:00:00";
  dayObj2.endDate = endDate ;
  dayObj2.minutes = moment(dayObj2.endDate).diff(moment(dayObj2.startDate), 'minutes');
  finalArray.push(dayObj2);

}
else{
  dayObj.startDate = startDate;
  dayObj.endDate = endDate;
  dayObj.minutes = datetime2.diff(datetime1, 'minutes');
  finalArray.push(dayObj);
}
console.log(JSON.stringify(finalArray));
// console.table(finalArray);
resolve(finalArray);
});
}

Production

 [
  {
  "startDate":"2018-05-04 02:08:05",
  "endDate":"2018-05-05 00:00:00",
  "minutes":1311
  },
  {
  "startDate":"2018-05-05 00:00:00",
  "endDate":"2018-05-06 00:00:00",
  "minutes":1440
  },
  {
  "startDate":"2018-05-06 00:00:00",
  "endDate":"2018-05-07 00:00:00",
  "minutes":1440
  },
  {
  "startDate":"2018-05-07 00:00:00",
  "endDate":"2018-05-08 00:00:00",
  "minutes":1440
  },
  {
  "startDate":"2018-05-08 00:00:00",
  "endDate":"2018-05-09 00:00:00",
  "minutes":1440
  },
  {
  "startDate":"2018-05-09 00:00:00",
  "endDate":"2018-05-10 00:00:00",
  "minutes":1440
  },
  {
  "startDate":"2018-05-10 00:00:00",
  "endDate":"2018-05-11 00:00:00",
  "minutes":1440
  },
  {
  "startDate":"2018-05-11 00:00:00",
  "endDate":"2018-05-12 00:00:00",
  "minutes":1440
  },
  {
  "startDate":"2018-05-12 00:00:00",
  "endDate":"2018-05-13 00:00:00",
  "minutes":1440
  },
  {
  "startDate":"2018-05-13 00:00:00",
  "endDate":"2018-05-14 00:00:00",
  "minutes":1440
  },
  {
  "startDate":"2018-05-14 00:00:00",
  "endDate":"2018-05-14 09:04:07",
  "minutes":544
  }
 ]

0

Je sais que cela a déjà été répondu, mais au cas où vous voudriez quelque chose de récursif et plus générique et ne comptant pas sur le moment, fromNowvous pourriez utiliser cette fonction que j'ai créée. Bien sûr, vous pouvez modifier sa logique pour l'adapter à vos besoins afin de prendre également en charge des années et des secondes.

var createdAt = moment('2019-05-13T14:23:00.607Z');
var expiresAt = moment('2019-05-14T14:23:00.563Z');

// You can also add years in the beginning of the array or seconds in its end
const UNITS = ["months", "weeks", "days", "hours", "minutes"]
function getValidFor (createdAt, expiresAt, unit = 'months') {
    const validForUnit = expiresAt.diff(createdAt, unit);
    // you could adjust the if to your needs 
    if (validForUnit > 1 || unit === "minutes") {
    return [validForUnit, unit];
  }
  return getValidFor(createdAt, expiresAt, UNITS[UNITS.indexOf(unit) + 1]);
}

-9
            var timecompare = {
            tstr: "",
            get: function (current_time, startTime, endTime) {
                this.tstr = "";
                var s = current_time.split(":"), t1 = tm1.split(":"), t2 = tm2.split(":"), t1s = Number(t1[0]), t1d = Number(t1[1]), t2s = Number(t2[0]), t2d = Number(t2[1]);

                if (t1s < t2s) {
                    this.t(t1s, t2s);
                }

                if (t1s > t2s) {
                    this.t(t1s, 23);
                    this.t(0, t2s);
                }

                var saat_dk = Number(s[1]);

                if (s[0] == tm1.substring(0, 2) && saat_dk >= t1d)
                    return true;
                if (s[0] == tm2.substring(0, 2) && saat_dk <= t2d)
                    return true;
                if (this.tstr.indexOf(s[0]) != 1 && this.tstr.indexOf(s[0]) != -1 && !(this.tstr.indexOf(s[0]) == this.tstr.length - 2))
                    return true;

                return false;

            },
            t: function (ii, brk) {
                for (var i = 0; i <= 23; i++) {
                    if (i < ii)
                        continue;
                    var s = (i < 10) ? "0" + i : i + "";
                    this.tstr += "," + s;
                    if (brk == i)
                        break;
                }
            }};

8
Pourriez-vous ajouter des explications plutôt que de simplement publier du code?
Paul Floyd
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.