¿Cómo obtengo el número de días entre dos fechas en JavaScript?


403

¿Cómo obtengo el número de días entre dos fechas en JavaScript? Por ejemplo, dadas dos fechas en cuadros de entrada:

<input id="first" value="1/1/2000"/>
<input id="second" value="1/1/2001"/>

<script>
  alert(datediff("day", first, second)); // what goes here?
</script>

55
El 99% de los casos en los que el usuario solicita "número de días entre dos fechas", lo que no entiende es que está tratando de comparar manzanas con peras. El problema se vuelve tan simple si se le pregunta "¿Cuántas FECHAS hay en un RANGO DE FECHA?", O cuántos cuadrados tengo que cruzar en el calendario. Esto deja fuera el horario y los problemas de horario de verano, etc. La confusión está implícita en nosotros debido a la estructura de datos de fecha y hora que no tiene sentido. No hay tal cosa como datetime, hay fecha y hay tiempo, dos objetos muy distintos tanto en naturaleza como en comportamiento
Mihail Shishkov

Para una función que divide la diferencia en unidades (enteras) de tiempo, use la respuesta en stackoverflow.com/a/53092438/3787376 .
Edward

Creo que esta pregunta debe eliminarse o al menos marcarse "evitar", ya que la mayoría de las respuestas son incorrectas o dependen de varias bibliotecas.
RobG

Respuestas:


409

Aquí hay una implementación rápida y sucia de datediff, como prueba de concepto para resolver el problema tal como se presenta en la pregunta. Se basa en el hecho de que puede obtener los milisegundos transcurridos entre dos fechas restándolos, lo que los obliga a su valor numérico primitivo (milisegundos desde el comienzo de 1970).

// new Date("dateString") is browser-dependent and discouraged, so we'll write
// a simple parse function for U.S. date format (which does no error checking)
function parseDate(str) {
    var mdy = str.split('/');
    return new Date(mdy[2], mdy[0]-1, mdy[1]);
}

function datediff(first, second) {
    // Take the difference between the dates and divide by milliseconds per day.
    // Round to nearest whole number to deal with DST.
    return Math.round((second-first)/(1000*60*60*24));
}

alert(datediff(parseDate(first.value), parseDate(second.value)));
<input id="first" value="1/1/2000"/>
<input id="second" value="1/1/2001"/>

Debe tener en cuenta que las API de fecha "normales" (sin "UTC" en el nombre) operan en la zona horaria local del navegador del usuario, por lo que, en general, podría tener problemas si su usuario se encuentra en una zona horaria que usted no esperar, y su código tendrá que lidiar con las transiciones de horario de verano. Debe leer detenidamente la documentación del objeto Date y sus métodos, y para cualquier cosa más complicada, considere usar una biblioteca que ofrezca API más seguras y potentes para la manipulación de fechas.

Además, con fines ilustrativos, el fragmento utiliza acceso con nombre en el windowobjeto por brevedad, pero en la producción debe usar API estandarizadas como getElementById , o más probablemente, algún marco de interfaz de usuario.


2
Creo que Math.trunc () es más apropiado. En caso de que alguien use objetos Date más precisos (es decir, que incluyen horas, minutos y segundos)
Jin Wang

21
Como la respuesta marcada como correcta y mejor votada (a partir de ahora), vale la pena comentar que esta respuesta no maneja correctamente el horario de verano. Ver la respuesta de Michael Liu en su lugar.
osullic

¿Qué hace exactamente parseDate?
Mohammad Kermani

2
@ osullic: esta respuesta maneja el horario de verano con Math.round , sin embargo, se espera que se le entregue solo cadenas de fecha, no fecha y hora.
RobG

2
Solo recuerde que la fecha está en formato estadounidense en este ejemplo, es decir, MM / DD / AAAA. Si necesita la versión del Reino Unido, debe cambiar el parseDatemétodo para que sea:return new Date(mdy[2], mdy[1], mdy[0]-1);
Viqas

207

Al escribir estas líneas, solo una de las otras respuestas maneja correctamente las transiciones DST (horario de verano). Aquí están los resultados en un sistema ubicado en California:

                                        1/1/2013- 3/10/2013- 11/3/2013-
User       Formula                      2/1/2013  3/11/2013  11/4/2013  Result
---------  ---------------------------  --------  ---------  ---------  ---------
Miles                   (d2 - d1) / N   31        0.9583333  1.0416666  Incorrect
some         Math.floor((d2 - d1) / N)  31        0          1          Incorrect
fuentesjr    Math.round((d2 - d1) / N)  31        1          1          Correct
toloco     Math.ceiling((d2 - d1) / N)  31        1          2          Incorrect

N = 86400000

Aunque Math.rounddevuelve los resultados correctos, creo que es algo torpe. En cambio, al contabilizar explícitamente los cambios en el desplazamiento UTC cuando comienza o termina el horario de verano, podemos usar la aritmética exacta:

function treatAsUTC(date) {
    var result = new Date(date);
    result.setMinutes(result.getMinutes() - result.getTimezoneOffset());
    return result;
}

function daysBetween(startDate, endDate) {
    var millisecondsPerDay = 24 * 60 * 60 * 1000;
    return (treatAsUTC(endDate) - treatAsUTC(startDate)) / millisecondsPerDay;
}

alert(daysBetween($('#first').val(), $('#second').val()));

Explicación

Los cálculos de fecha de JavaScript son complicados porque los Dateobjetos almacenan las horas internamente en UTC, no en la hora local. Por ejemplo, 3/10/2013 12:00 AM Hora estándar del Pacífico (UTC-08: 00) se almacena como 3/10/2013 8:00 AM UTC, y 3/11/2013 12:00 AM Hora del Pacífico ( UTC-07: 00) se almacena como 3/11/2013 7:00 AM UTC. ¡En este día, la medianoche a medianoche hora local es solo 23 horas en UTC!

Aunque un día en la hora local puede tener más o menos de 24 horas, un día en UTC siempre es exactamente 24 horas. 1 El daysBetweenmétodo que se muestra arriba aprovecha este hecho al llamar primero treatAsUTCpara ajustar ambas horas locales a la medianoche UTC, antes de restar y dividir.

1. JavaScript ignora los segundos bisiestos.


2
No es necesario usar UTC, está bien configurar las horas locales a medianoche (o el mismo valor para ambas fechas). El día fraccional introducido por el horario de verano es solo ± 0.04 como máximo (y en algunos lugares menos), por lo que se completa con Math.round . ;-) Confiar en el constructor Fecha para analizar cadenas no es una buena idea. Si realmente desea usar valores UTC, analice las cadenas usando Date.UTC(...)en primer lugar.
RobG

2
@RobG: Como dije en mi respuesta: "Aunque Math.round devuelve los resultados correctos, creo que es algo torpe. En cambio, al explicar explícitamente los cambios en el desplazamiento UTC cuando comienza o termina el horario de verano, podemos usar la aritmética exacta".
Michael Liu

En realidad, los tiempos que has representado como "incorrectos" son, técnicamente, correctos. No está cambiando las DateTimes a UTC ... solo está cambiando la hora de cada DateTime para obtener un número entero artificial. El redondeo no es "torpe" ... es exactamente el enfoque correcto aquí porque de todos modos eso es lo que estás haciendo en tu cabeza: estás redondeando la porción de tiempo (horas, minutos, segundos) y solo estás tratando de obtener un todo número de día
JDB todavía recuerda a Mónica el

116

La forma más fácil de obtener la diferencia entre dos fechas:

var diff =  Math.floor(( Date.parse(str2) - Date.parse(str1) ) / 86400000); 

Obtiene los días de diferencia (o NaN si no se pudo analizar uno o ambos). La fecha de análisis dio el resultado en milisegundos y para obtenerlo por día, debe dividirlo entre 24 * 60 * 60 * 1000

Si desea dividirlo por días, horas, minutos, segundos y milisegundos:

function dateDiff( str1, str2 ) {
    var diff = Date.parse( str2 ) - Date.parse( str1 ); 
    return isNaN( diff ) ? NaN : {
        diff : diff,
        ms : Math.floor( diff            % 1000 ),
        s  : Math.floor( diff /     1000 %   60 ),
        m  : Math.floor( diff /    60000 %   60 ),
        h  : Math.floor( diff /  3600000 %   24 ),
        d  : Math.floor( diff / 86400000        )
    };
}

Aquí está mi versión refactorizada de la versión de James:

function mydiff(date1,date2,interval) {
    var second=1000, minute=second*60, hour=minute*60, day=hour*24, week=day*7;
    date1 = new Date(date1);
    date2 = new Date(date2);
    var timediff = date2 - date1;
    if (isNaN(timediff)) return NaN;
    switch (interval) {
        case "years": return date2.getFullYear() - date1.getFullYear();
        case "months": return (
            ( date2.getFullYear() * 12 + date2.getMonth() )
            -
            ( date1.getFullYear() * 12 + date1.getMonth() )
        );
        case "weeks"  : return Math.floor(timediff / week);
        case "days"   : return Math.floor(timediff / day); 
        case "hours"  : return Math.floor(timediff / hour); 
        case "minutes": return Math.floor(timediff / minute);
        case "seconds": return Math.floor(timediff / second);
        default: return undefined;
    }
}

2
Mala respuesta. Math.floor () te perderá un día cuando los relojes avancen en el horario de verano. Math.round () dará la respuesta correcta en la mayoría de las situaciones, pero también hay mejores opciones en otras respuestas.
Phil B

101

Recomiendo usar la biblioteca moment.js ( http://momentjs.com/docs/#/displaying/difference/ ). Maneja el horario de verano correctamente y, en general, es excelente para trabajar.

Ejemplo:

var start = moment("2013-11-03");
var end = moment("2013-11-04");
end.diff(start, "days")
1

10
Solo como una advertencia, mientras momentjs es genial, es una dependencia bastante grande
Jason Axelson, el

Realmente debería ser, ¡ end.diff(start,"days")aunque el código tal como está escrito funcionará porque la fecha de inicio es posterior a la fecha de finalización!
gordon613

40

Continuaría y tomaría esta pequeña utilidad y en ella encontrarás funciones para esto. Aquí hay un pequeño ejemplo:

        <script type="text/javascript" src="date.js"></script>
        <script type="text/javascript">
            var minutes = 1000*60;
            var hours = minutes*60;
            var days = hours*24;

            var foo_date1 = getDateFromFormat("02/10/2009", "M/d/y");
            var foo_date2 = getDateFromFormat("02/12/2009", "M/d/y");

            var diff_date = Math.round((foo_date2 - foo_date1)/days);
            alert("Diff date is: " + diff_date );
        </script>

28
const startDate = '2017-11-08';
const endDate   = '2017-10-01';
const timeDiff  = (new Date(startDate)) - (new Date(endDate));
const days      = timeDiff / (1000 * 60 * 60 * 24)
  1. Establecer fecha de inicio
  2. Establecer fecha de finalización
  3. Calcular la diferencia
  4. Convertir milisegundos a días

Actualización: Sé que esto no es parte de sus preguntas, pero en general no recomendaría hacer ningún cálculo o manipulación de la fecha en JavaScript vainilla y más bien usar una biblioteca como date- fns o moment.js debido a muchos casos extremos .


55
Agradezco respuestas como estas: ¡se requieren dependencias cortas, simples y no aleatorias! Salud.
daCoda

2
¿Soy solo yo quien ha timeDiffregresado en negativo? No debe timeDiffser (new Date(endDate)) - (new Date(startDate));?
Feyisayo Sonubi

@ feyisayo-sonubi depende del orden en que pases la fecha de inicio y finalización En este ejemplo(new Date('2017-11-08')) - (new Date('2017-10-01')) // 3283200000
marcobiedermann

const timeDiff = +(new Date(start)) - +(new Date(end));
Ben Racicot

Excelente. Aunque prefieroreturn (Date.UTC(yr2, mo2-1, dy2) - Date.UTC(yr1, mo1-1, dy1)) / 86400000;
dcromley

13

Usando Moment.js

var future = moment('05/02/2015');
var start = moment('04/23/2015');
var d = future.diff(start, 'days'); // 9
console.log(d);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment-with-locales.min.js"></script>


moment.js es realmente útil para cosas como YTD diff cuenta var now = moment(), yearStart = moment().startOf('year'); var ytdDays = now.diff(yearStart, 'days'); // this can be years, months, weeks, days, hours, minutes, and seconds console.log(ytdDays); más aquí: momentjs.com
Sharif

11

Los valores de fecha en JS son valores de fecha y hora.

Entonces, los cálculos de fecha directa son inconsistentes:

(2013-11-05 00:00:00) - (2013-11-04 10:10:10) < 1 day

Por ejemplo, necesitamos convertir la segunda fecha:

(2013-11-05 00:00:00) - (2013-11-04 00:00:00) = 1 day

El método podría ser truncar los molinos en ambas fechas:

var date1 = new Date('2013/11/04 00:00:00');
var date2 = new Date('2013/11/04 10:10:10'); //less than 1
var start = Math.floor(date1.getTime() / (3600 * 24 * 1000)); //days as integer from..
var end = Math.floor(date2.getTime() / (3600 * 24 * 1000)); //days as integer from..
var daysDiff = end - start; // exact dates
console.log(daysDiff);

date2 = new Date('2013/11/05 00:00:00'); //1

var start = Math.floor(date1.getTime() / (3600 * 24 * 1000)); //days as integer from..
var end = Math.floor(date2.getTime() / (3600 * 24 * 1000)); //days as integer from..
var daysDiff = end - start; // exact dates
console.log(daysDiff);


9

Es mejor deshacerse de DST, Math.ceil, Math.floor, etc. utilizando los horarios UTC:

var firstDate = Date.UTC(2015,01,2);
var secondDate = Date.UTC(2015,04,22);
var diff = Math.abs((firstDate.valueOf() 
    - secondDate.valueOf())/(24*60*60*1000));

Este ejemplo da la diferencia de 109 días. 24*60*60*1000Es un día en milisegundos.


9

Para calcular los días entre 2 fechas dadas, puede usar el siguiente código: las fechas que uso aquí son 01 de enero de 2016 y 31 de diciembre de 2016

var day_start = new Date("Jan 01 2016");
var day_end = new Date("Dec 31 2016");
var total_days = (day_end - day_start) / (1000 * 60 * 60 * 24);
document.getElementById("demo").innerHTML = Math.round(total_days);
<h3>DAYS BETWEEN GIVEN DATES</h3>
<p id="demo"></p>


9

Es posible calcular una diferencia de días de prueba completa entre dos fechas que descansan en diferentes ZT utilizando la siguiente fórmula:

var start = new Date('10/3/2015');
var end = new Date('11/2/2015');
var days = (end - start) / 1000 / 60 / 60 / 24;
console.log(days);
// actually its 30 ; but due to daylight savings will show 31.0xxx
// which you need to offset as below
days = days - (end.getTimezoneOffset() - start.getTimezoneOffset()) / (60 * 24);
console.log(days);


Esta es la respuesta más correcta, ¡debes tener en cuenta el horario de verano! Gracias
Gisway

6

Encontré esta pregunta cuando quiero hacer un cálculo en dos fechas, pero la fecha tiene un valor de horas y minutos, modifiqué la respuesta de @ michael-liu para que se ajustara a mis requisitos, y pasó mi prueba.

días de diferencia 2012-12-31 23:00y 2013-01-01 01:00debe ser igual a 1. (2 horas) días de diferencia 2012-12-31 01:00y 2013-01-01 23:00debe ser igual a 1. (46 horas)

function treatAsUTC(date) {
    var result = new Date(date);
    result.setMinutes(result.getMinutes() - result.getTimezoneOffset());
    return result;
}

var millisecondsPerDay = 24 * 60 * 60 * 1000;
function diffDays(startDate, endDate) {
    return Math.floor(treatAsUTC(endDate) / millisecondsPerDay) - Math.floor(treatAsUTC(startDate) / millisecondsPerDay);
}

6
var start= $("#firstDate").datepicker("getDate");
var end= $("#SecondDate").datepicker("getDate");
var days = (end- start) / (1000 * 60 * 60 * 24);
 alert(Math.round(days));

Ejemplo de jsfiddle :)


6

Creo que las soluciones no son correctas al 100%. Usaría ceil en lugar de piso , redondo funcionará pero no es la operación correcta.

function dateDiff(str1, str2){
    var diff = Date.parse(str2) - Date.parse(str1); 
    return isNaN(diff) ? NaN : {
        diff: diff,
        ms: Math.ceil(diff % 1000),
        s: Math.ceil(diff / 1000 % 60),
        m: Math.ceil(diff / 60000 % 60),
        h: Math.ceil(diff / 3600000 % 24),
        d: Math.ceil(diff / 86400000)
    };
}

44
Los días pueden tener más de 24 horas y los minutos pueden tener más de 60 segundos. El uso de Math.ceil () se sobrevaloraría en estos casos.
Rich Dougherty

5

¿Qué pasa con el uso de formatDate del widget DatePicker? Puede usarlo para convertir las fechas en formato de marca de tiempo (milisegundos desde el 01/01/1970) y luego hacer una simple resta.


5

function timeDifference(date1, date2) {
  var oneDay = 24 * 60 * 60; // hours*minutes*seconds
  var oneHour = 60 * 60; // minutes*seconds
  var oneMinute = 60; // 60 seconds
  var firstDate = date1.getTime(); // convert to milliseconds
  var secondDate = date2.getTime(); // convert to milliseconds
  var seconds = Math.round(Math.abs(firstDate - secondDate) / 1000); //calculate the diffrence in seconds
  // the difference object
  var difference = {
    "days": 0,
    "hours": 0,
    "minutes": 0,
    "seconds": 0,
  }
  //calculate all the days and substract it from the total
  while (seconds >= oneDay) {
    difference.days++;
    seconds -= oneDay;
  }
  //calculate all the remaining hours then substract it from the total
  while (seconds >= oneHour) {
    difference.hours++;
    seconds -= oneHour;
  }
  //calculate all the remaining minutes then substract it from the total 
  while (seconds >= oneMinute) {
    difference.minutes++;
    seconds -= oneMinute;
  }
  //the remaining seconds :
  difference.seconds = seconds;
  //return the difference object
  return difference;
}
console.log(timeDifference(new Date(2017,0,1,0,0,0),new Date()));


1
¿Puedo solicitarle que agregue un poco más de contexto alrededor de su respuesta? Las respuestas de solo código son difíciles de entender. Ayudará tanto al autor de la pregunta como a los futuros lectores si puede agregar más información en su publicación.
RBT

quería editar pero recibía errores, podía enviar la edición :(.
Noreddine Belhadj Cheikh

2
@ N.Belhadj puede reemplazar todos esos bucles while con operaciones simples de div y mod (%)
Mihail Shishkov

4

Puede que esta no sea la solución más elegante, pero parece responder a la pregunta con un código relativamente simple, creo. ¿No puedes usar algo como esto?

function dayDiff(startdate, enddate) {
  var dayCount = 0;

  while(enddate >= startdate) {
    dayCount++;
    startdate.setDate(startdate.getDate() + 1);
  }

return dayCount; 
}

Esto supone que está pasando objetos de fecha como parámetros.


4

Si tiene dos marcas de tiempo de Unix, puede usar esta función (hecho un poco más detallado para mayor claridad):

// Calculate number of days between two unix timestamps
// ------------------------------------------------------------
var daysBetween = function(timeStampA, timeStampB) {
    var oneDay = 24 * 60 * 60 * 1000; // hours * minutes * seconds * milliseconds
    var firstDate = new Date(timeStampA * 1000);
    var secondDate = new Date(timeStampB * 1000);
    var diffDays = Math.round(Math.abs((firstDate.getTime() - secondDate.getTime())/(oneDay)));
    return diffDays;
};

Ejemplo:

daysBetween(1096580303, 1308713220); // 2455

4

Tenga cuidado al usar milisegundos .

El date.getTime () devuelve milisegundos y hacer la operación matemática con milisegundos requiere para incluir

  • Horario de verano (DST)
  • comprobar si ambas fechas tienen el mismo tiempo (horas, minutos, segundos, milisegundos)
  • asegúrese de qué comportamiento de diferencia de días se requiere: 19 de septiembre de 2016 - 29 de septiembre de 2016 = 1 o 2 días de diferencia?

El ejemplo del comentario anterior es la mejor solución que encontré hasta ahora https://stackoverflow.com/a/11252167/2091095 . Pero use +1 a su resultado si desea contar todos los días involucrados.

function treatAsUTC(date) {
    var result = new Date(date);
    result.setMinutes(result.getMinutes() - result.getTimezoneOffset());
    return result;
}

function daysBetween(startDate, endDate) {
    var millisecondsPerDay = 24 * 60 * 60 * 1000;
    return (treatAsUTC(endDate) - treatAsUTC(startDate)) / millisecondsPerDay;
}

var diff = daysBetween($('#first').val(), $('#second').val()) + 1;

4

Date.prototype.days = function(to) {
  return Math.abs(Math.floor(to.getTime() / (3600 * 24 * 1000)) - Math.floor(this.getTime() / (3600 * 24 * 1000)))
}


console.log(new Date('2014/05/20').days(new Date('2014/05/23'))); // 3 days

console.log(new Date('2014/05/23').days(new Date('2014/05/20'))); // 3 days


3

Tuve el mismo problema en Angular. Hago la copia porque, de lo contrario, sobrescribirá la primera fecha. Ambas fechas deben tener hora 00:00:00 (obviamente)

 /*
* Deze functie gebruiken we om het aantal dagen te bereken van een booking.
* */
$scope.berekenDagen = function ()
{
    $scope.booking.aantalDagen=0;

    /*De loper is gelijk aan de startdag van je reservatie.
     * De copy is nodig anders overschijft angular de booking.van.
     * */
    var loper = angular.copy($scope.booking.van);

    /*Zolang de reservatie beschikbaar is, doorloop de weekdagen van je start tot einddatum.*/
    while (loper < $scope.booking.tot) {
        /*Tel een dag op bij je loper.*/
        loper.setDate(loper.getDate() + 1);
        $scope.booking.aantalDagen++;
    }

    /*Start datum telt natuurlijk ook mee*/
    $scope.booking.aantalDagen++;
    $scope.infomsg +=" aantal dagen: "+$scope.booking.aantalDagen;
};

3

Utilicé el siguiente código para experimentar la funcionalidad de fecha de publicación para una publicación de noticias. Calculo el minuto, la hora, el día o el año en función de la fecha de publicación y la fecha actual.

var startDate= new Date("Mon Jan 01 2007 11:00:00");
var endDate  =new Date("Tue Jan 02 2007 12:50:00");
var timeStart = startDate.getTime();
var timeEnd = endDate.getTime();
var yearStart = startDate.getFullYear();
var yearEnd   = endDate.getFullYear();
if(yearStart == yearEnd)
 {
  var hourDiff = timeEnd - timeStart; 
  var secDiff = hourDiff / 1000;
  var minDiff = hourDiff / 60 / 1000; 
  var hDiff = hourDiff / 3600 / 1000; 
  var myObj = {};
  myObj.hours = Math.floor(hDiff);
  myObj.minutes = minDiff  
  if(myObj.hours >= 24)
   {
    console.log(Math.floor(myObj.hours/24) + "day(s) ago")
   } 
 else if(myObj.hours>0)
  {
   console.log(myObj.hours +"hour(s) ago")
  }
 else
  {
   console.log(Math.abs(myObj.minutes) +"minute(s) ago")
  }
}
else
{
var yearDiff = yearEnd - yearStart;
console.log( yearDiff +" year(s) ago");
}

Explique su código y resolvió el problema, solo pegar el código se considera una mala respuesta.
Marco Scabbiolo

2
Si bien este código puede responder la pregunta, proporcionar un contexto adicional con respecto a cómo y / o por qué resuelve el problema mejoraría el valor a largo plazo de la respuesta.
Michael Parker

Gracias @ MarcoScabbiolo, @ Michael Parker por los comentarios. Dado que soy nuevo en Stackoverflow en términos de respuesta, no estaba al tanto de cómo debería proporcionarse la solución
Ramees Rahath

3

si quieres tener un DateArray con fechas prueba esto:

<script>
        function getDates(startDate, stopDate) {
        var dateArray = new Array();
        var currentDate = moment(startDate);
        dateArray.push( moment(currentDate).format('L'));

        var stopDate = moment(stopDate);
        while (dateArray[dateArray.length -1] != stopDate._i) {
            dateArray.push( moment(currentDate).format('L'));
            currentDate = moment(currentDate).add(1, 'days');
        }
        return dateArray;
      }
</script>

DebugSnippet


3

La manera simple de calcular los días entre dos fechas es eliminar ambos componentes de tiempo, es decir, establecer las horas, minutos, segundos y milisegundos a 0 y luego restar su tiempo y sumergirlo en milisegundos por valor de un día.

var firstDate= new Date(firstDate.setHours(0,0,0,0));
var secondDate= new Date(secondDate.setHours(0,0,0,0));
var timeDiff = firstDate.getTime() - secondDate.getTime();
var diffDays =timeDiff / (1000 * 3600 * 24);

El problema con su solución es que está asumiendo que firstDate y secondDate son fechas que no hay necesidad de cambiar de nuevo, y si no son date * que no lo son) obtendrá un error en setHours. para corregir esto, debe mover setHours fuera denew Date
AaA

2
function formatDate(seconds, dictionary) {
    var foo = new Date;
    var unixtime_ms = foo.getTime();
    var unixtime = parseInt(unixtime_ms / 1000);
    var diff = unixtime - seconds;
    var display_date;
    if (diff <= 0) {
        display_date = dictionary.now;
    } else if (diff < 60) {
        if (diff == 1) {
            display_date = diff + ' ' + dictionary.second;
        } else {
            display_date = diff + ' ' + dictionary.seconds;
        }
    } else if (diff < 3540) {
        diff = Math.round(diff / 60);
        if (diff == 1) {
            display_date = diff + ' ' + dictionary.minute;
        } else {
            display_date = diff + ' ' + dictionary.minutes;
        }
    } else if (diff < 82800) {
        diff = Math.round(diff / 3600);
        if (diff == 1) {
            display_date = diff + ' ' + dictionary.hour;
        } else {
            display_date = diff + ' ' + dictionary.hours;
        }
    } else {
        diff = Math.round(diff / 86400);
        if (diff == 1) {
            display_date = diff + ' ' + dictionary.day;
        } else {
            display_date = diff + ' ' + dictionary.days;
        }
    }
    return display_date;
}

2

Sencillo, fácil y sofisticado. Esta función se llamará cada 1 segundo para actualizar el tiempo.

const year = (new Date().getFullYear());
const bdayDate = new Date("04,11,2019").getTime();  //mmddyyyy

// countdown
let timer = setInterval(function() {

// get today's date
const today = new Date().getTime();

// get the difference
const diff = bdayDate - today;

// math
let days = Math.floor(diff / (1000 * 60 * 60 * 24));
let hours = Math.floor((diff % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
let minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60));
let seconds = Math.floor((diff % (1000 * 60)) / 1000);

}, 1000);

1

Una mejor solución por

Ignorando parte del tiempo

devolverá 0 si ambas fechas son iguales.

function dayDiff(firstDate, secondDate) {
  firstDate = new Date(firstDate);
  secondDate = new Date(secondDate);
  if (!isNaN(firstDate) && !isNaN(secondDate)) {
    firstDate.setHours(0, 0, 0, 0); //ignore time part
    secondDate.setHours(0, 0, 0, 0); //ignore time part
    var dayDiff = secondDate - firstDate;
    dayDiff = dayDiff / 86400000; // divide by milisec in one day
    console.log(dayDiff);
  } else {
    console.log("Enter valid date.");
  }
}

$(document).ready(function() {
  $('input[type=datetime]').datepicker({
    dateFormat: "mm/dd/yy",
    changeMonth: true,
    changeYear: true
  });
  $("#button").click(function() {
    dayDiff($('#first').val(), $('#second').val());
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<script src="//code.jquery.com/ui/1.12.1/jquery-ui.js"></script>

<input type="datetime" id="first" value="12/28/2016" />
<input type="datetime" id="second" value="12/28/2017" />
<input type="button" id="button" value="Calculate">


1

Una contribución, para la fecha anterior al 1970-01-01 y posterior al 2038-01-19

function DateDiff(aDate1, aDate2) {
  let dDay = 0;
  this.isBissexto = (aYear) => {
    return (aYear % 4 == 0 && aYear % 100 != 0) || (aYear % 400 == 0);
  };
  this.getDayOfYear = (aDate) => {
    let count = 0;
    for (let m = 0; m < aDate.getUTCMonth(); m++) {
      count += m == 1 ? this.isBissexto(aDate.getUTCFullYear()) ? 29 : 28 : /(3|5|8|10)/.test(m) ? 30 : 31;
    }
    count += aDate.getUTCDate();
    return count;
  };
  this.toDays = () => {
    return dDay;
  };
  (() => {
    let startDate = aDate1.getTime() <= aDate2.getTime() ? new Date(aDate1.toISOString()) : new Date(aDate2.toISOString());
    let endDate = aDate1.getTime() <= aDate2.getTime() ? new Date(aDate2.toISOString()) : new Date(aDate1.toISOString());
    while (startDate.getUTCFullYear() != endDate.getUTCFullYear()) {
      dDay += (this.isBissexto(startDate.getFullYear())? 366 : 365) - this.getDayOfYear(startDate) + 1;
      startDate = new Date(startDate.getUTCFullYear()+1, 0, 1);
    }
    dDay += this.getDayOfYear(endDate) - this.getDayOfYear(startDate);
  })();
}

0
   function validateDate() {
        // get dates from input fields
        var startDate = $("#startDate").val();
        var endDate = $("#endDate").val();
        var sdate = startDate.split("-");
        var edate = endDate.split("-");
        var diffd = (edate[2] - sdate[2]) + 1;
        var leap = [ 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ];
        var nonleap = [ 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ];
        if (sdate[0] > edate[0]) {
            alert("Please enter End Date Year greater than Start Date Year");
            document.getElementById("endDate").value = "";
            diffd = "";
        } else if (sdate[1] > edate[1]) {
            alert("Please enter End Date month greater than Start Date month");
            document.getElementById("endDate").value = "";
            diffd = "";
        } else if (sdate[2] > edate[2]) {
            alert("Please enter End Date greater than Start Date");
            document.getElementById("endDate").value = "";
            diffd = "";
        } else {
            if (sdate[0] / 4 == 0) {
                while (sdate[1] < edate[1]) {
                    diffd = diffd + leap[sdate[1]++];
                }
            } else {
                while (sdate[1] < edate[1]) {
                    diffd = diffd + nonleap[sdate[1]++];
                }
            }
            document.getElementById("numberOfDays").value = diffd;
        }
    }

0

Puede usar UnderscoreJS para formatear y calcular la diferencia.

Demo https://jsfiddle.net/sumitridhal/8sv94msp/

 var startDate = moment("2016-08-29T23:35:01");
var endDate = moment("2016-08-30T23:35:01");  
  

console.log(startDate);
console.log(endDate);

var resultHours = endDate.diff(startDate, 'hours', true);

document.body.innerHTML = "";
document.body.appendChild(document.createTextNode(resultHours));
body { white-space: pre; font-family: monospace; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.5.1/moment.min.js"></script>

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.