Ottieni ore di differenza tra due date in Moment Js


386

Sono in grado di ottenere la differenza tra due date usando MomentJs come segue:

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

Tuttavia, voglio anche visualizzare l'ora quando applicabile (solo quando sono trascorsi> = 60 minuti).

Tuttavia, quando provo a recuperare le ore di durata utilizzando quanto segue:

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

sta restituendo l'ora corrente e non il numero di ore tra le due date.

Come posso ottenere la differenza in ore tra due momenti?

Risposte:


612

Eri vicino. Devi solo usare il duration.asHours()metodo (vedi i documenti ).

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

8
Non dovrebbe essere startTime.diff(end, 'hours', true);? La duration.asHours (); ritornerebbe 1 se fosse 25 ore fa.
Daniel F,

29
@DanielF Se si utilizza MomentJS> = versione 2.0.0, è possibile utilizzare .diff(), sì. Tranne che sarebbe end.diff(startTime, 'hours', true)ottenere il numero di ore come un numero positivo. Tuttavia, il tuo secondo punto non è corretto. duration.hours()ritornerebbe 1 se fosse 25 ore fa, ma duration.asHours()ritornerebbe 25.
GregL

5
@GregL Sono corretto jsfiddle.net/qxxr1Lyr Devo aver erroneamente usato il .hours()metodo senza accorgermene.
Daniel F,

5
In che modo questo ha così tanti voti quando tutto ciò che fa è rendere l'OP consapevole di un refuso che la maggior parte degli IDE ti rivelerebbe comunque ( imgur.com/a/ikyayIL ). Quindi il rappresentante è il primo nel migliore dei modi, mentre altri lavorano per gli scarti. Oh, hai risolto un errore di battitura ... ecco 4.7k rep
zanderwar

3
@zanderwar Capisco la tua frustrazione, ma questa è una domanda di 5 anni. Oggi tali domande e risposte non volerebbero.
Jean-François Fabre

219

Il seguente blocco di codice mostra come calcolare la differenza nel numero di giorni tra due date usando 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)

61
Almeno il suo blocco di codice mostrava tutte le variabili che erano in uso a differenza della risposta accettata o della domanda. Se qualcuno vuole votare verso il basso, dovrebbe votare la domanda in quanto si tratta di un blocco di codice incompleto per iniziare. Quel blocco di codice ha davvero bisogno di spiegazioni?
Jordan Papaleo,

23
Questa risposta è abbastanza chiara e ancora più completa per me della risposta accettata sopra, dove non sai da dove arrivano 'end' e 'startTime' ... Grazie mille per la tua risposta Raj!
Pierre

3
Ora è un po 'più semplice cavarsela var now = moment();. Vedi momentjs.com/docs/#/parsing/now
rob3c

161

Oppure puoi fare semplicemente:

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

documenti: qui


12
Come posso mostrare tutte le ore, i minuti e i secondi insieme? Come HH: MM: SS?
Faizan Saiyed,

16

Tutto quello che devi fare è passare hourscome secondo parametro alla funzione diff dei momenti.

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

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

Esempio:

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

C'è un ottimo momentmetodo chiamato fromNow()che restituirà il tempo da un momento specifico in una bella forma leggibile dall'uomo, come questo:

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

O se lo desideri tra due date specifiche puoi usare:

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

Tratto da Documenti:


7

So che questo è vecchio, ma ecco una soluzione di una linea:

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

Dove inizio e fine sono oggetti momento.

Godere!


... già proposto da Sebastián Lara nel 2016
YakovL

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

Come puoi vedere, la data di inizio e fine doveva essere un momento per far funzionare questo metodo.


2
Mentre questo codice può rispondere alla domanda, fornendo un contesto aggiuntivo riguardo a come e perché risolve il problema migliorerebbe il valore a lungo termine della risposta.
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
Rimuovi tutte le conversioni non necessarie da / a rappresentazioni di stringhe di momenti e otterrai la risposta accettata.
Vladimir M,

1
Perché i trattini bassi extra all'inizio dei nomi delle variabili?
zenw0lf,

1

Nel mio caso, volevo ore e minuti:

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

Per maggiori informazioni consultare i documenti ufficiali .


0

Se vuoi minuti totali tra due date nel giorno saggio di quanto sotto il codice ti aiuterà a pieno Data di inizio: 2018-05-04 02:08:05 , Data di fine: 14-05-2018 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);
});
}

Produzione

 [
  {
  "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

So che questa è già una risposta, ma nel caso in cui desideri qualcosa di ricorsivo e più generico e non fare affidamento sul momento, fromNowpotresti utilizzare questa funzione che ho creato. Ovviamente puoi cambiare la sua logica per adattarla alle tue esigenze per supportare anche anni e secondi.

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
Potresti aggiungere qualche spiegazione piuttosto che pubblicare semplicemente un codice?
Paul Floyd,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.