Obtenga diferencia de horas entre dos fechas en Moment Js

386

Puedo obtener la diferencia entre dos fechas usando MomentJs de la siguiente manera:

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

Sin embargo, también quiero mostrar la hora cuando corresponda (solo cuando> = 60 minutos han pasado).

Sin embargo, cuando trato de recuperar las horas de duración usando lo siguiente:

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

devuelve la hora actual y no la cantidad de horas entre las dos fechas.

¿Cómo obtengo la diferencia en horas entre dos momentos?

Dani
fuente

Respuestas:

612

Estabas cerca Solo necesita usar el duration.asHours()método (ver los documentos ).

var duration = moment.duration(end.diff(startTime));
var hours = duration.asHours();
GregL
fuente
8
¿No debería ser startTime.diff(end, 'hours', true);? La duración.as horas (); devolvería 1 si fue hace 25 horas.
Daniel F
29
@DanielF Si está usando MomentJS> = versión 2.0.0, podría usar .diff(), sí. Excepto que sería end.diff(startTime, 'hours', true)obtener el número de horas como un número positivo. Sin embargo, su segundo punto no es correcto. duration.hours()devolvería 1 si fue hace 25 horas, pero duration.asHours()devolvería 25.
GregL
55
@GregL Estoy corregido jsfiddle.net/qxxr1Lyr Debo haber utilizado el .hours()método por error sin darme cuenta.
Daniel F
55
¿Cómo tiene esto tantos votos cuando todo lo que hace es informar al OP de un error tipográfico que la mayoría de los IDE le revelarían de todos modos ( imgur.com/a/ikyayIL )? El representante de SO es el primero en vestirse mejor, mientras que otros trabajan para sobras. Oh, arreglaste un error tipográfico ... aquí hay 4.7k de representante
zanderwar
3
@zanderwar Entiendo tu frustración, pero esta es una pregunta de 5 años. Hoy tales preguntas y respuestas no volarían.
Jean-François Fabre
219

El siguiente bloque de código muestra cómo calcular la diferencia en el número de días entre dos fechas 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)
selftaught91
fuente
61
Al menos su bloque de código mostró todas las variables que estaban en uso a diferencia de la respuesta aceptada o la pregunta. Si alguien quiere rechazar el voto, debe rechazar la pregunta, ya que es un bloque de código incompleto para comenzar. ¿Ese bloque de código realmente necesita explicación?
Jordan Papaleo
23
Esta respuesta es lo suficientemente clara y aún más completa para mí que la respuesta aceptada arriba, donde no sabes de dónde provienen 'end' y 'startTime' ... ¡Muchas gracias por tu respuesta Raj!
Pierre
3
Ahora es un poco más sencillo sobrevivir var now = moment();. Ver momentjs.com/docs/#/parsing/now
rob3c
161

O puedes hacer simplemente:

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: aquí

Sebastián Lara
fuente
12
¿Cómo puedo mostrar todas las horas, minutos y segundos juntos? Como HH: MM: SS?
Faizan Saiyed
16

Todo lo que necesita hacer es pasar hourscomo el segundo parámetro a la función diff de momentos.

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

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

Ejemplo:

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>

JSON C11
fuente
12

Hay un gran momentmétodo llamado fromNow()que devolverá el tiempo de un tiempo específico en forma agradable y legible para humanos, como este:

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

O si desea que entre dos fechas específicas puede usar:

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

Tomado de los documentos:

Dryden Williams
fuente
7

Sé que esto es viejo, pero aquí hay una solución única:

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

Donde inicio y fin son objetos de momento.

¡Disfrutar!

Francois Nadeau
fuente
... ya propuesto por 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();

Como puede ver, la fecha de inicio y finalización deben ser objetos de momento para que este método funcione.

Richang Sharma
fuente
2
Si bien este código puede responder la pregunta, proporcionar un contexto adicional sobre cómo y por qué resuelve el problema mejoraría el valor a largo plazo de la respuesta.
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);
AKHIL
fuente
2
Elimine todas las conversiones innecesarias de / a cadenas de representaciones de momentos y terminará con la respuesta aceptada.
Vladimir M
1
¿Por qué los subrayados adicionales al comienzo de los nombres de variables?
zenw0lf
1

En mi caso, quería horas y minutos:

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

Para obtener más información, consulte los documentos oficiales .

Anil Singh
fuente
0

Si desea un total de minutos entre dos fechas en un día que el siguiente código le ayudará a completar la Fecha de inicio: 2018-05-04 02:08:05 , Fecha de finalización: 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);
});
}

Salida

 [
  {
  "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
  }
 ]
Renote Gotecha
fuente
0

Sé que esto ya está respondido, pero en caso de que desee algo recursivo y más genérico y no dependa del momento fromNow, podría usar esta función que creé. Por supuesto, puede cambiar su lógica para ajustarla a sus necesidades para que también sea compatible con años y segundos.

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]);
}
Mounir Dhahri
fuente
-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;
                }
            }};
Osman AKTAS
fuente
8
¿Podría agregar alguna explicación en lugar de solo publicar código?
Paul Floyd