Obter diferença entre 2 datas em JavaScript?

Como obtenho a diferença entre 2 datas em dias completos (não quero frações de um dia)

var date1 = new Date('7/11/2010'); var date2 = new Date('12/12/2010'); var diffDays = date2.getDate() - date1.getDate(); alert(diffDays) 

Eu tentei o acima, mas isso não funcionou.

Aqui está um jeito :

 var date1 = new Date("7/13/2010"); var date2 = new Date("12/15/2010"); var timeDiff = Math.abs(date2.getTime() - date1.getTime()); var diffDays = Math.ceil(timeDiff / (1000 * 3600 * 24)); alert(diffDays); 

Observe que precisamos colocar a data entre aspas. O resto do código obtém a diferença de tempo em milissegundos e depois divide para obter o número de dias. A data espera o formato mm / dd / aaaa.

Uma solução mais correta

já que as datas têm naturalmente informações de fuso horário, que podem abranger regiões com diferentes ajustes de economia de luz diurna

Respostas anteriores a essa pergunta não levam em conta casos em que as duas datas em questão abrangem uma alteração de horário de verão (DST). A data em que a alteração do horário de verão ocorre terá uma duração em milissegundos, que é != 1000*60*60*24 , portanto, o cálculo típico falhará.

Você pode contornar isso primeiro normalizando as duas datas em UTC e, em seguida, calculando a diferença entre essas duas datas UTC.

Agora, a solução pode ser escrita como

 const _MS_PER_DAY = 1000 * 60 * 60 * 24; // a and b are javascript Date objects function dateDiffInDays(a, b) { // Discard the time and time-zone information. const utc1 = Date.UTC(a.getFullYear(), a.getMonth(), a.getDate()); const utc2 = Date.UTC(b.getFullYear(), b.getMonth(), b.getDate()); return Math.floor((utc2 - utc1) / _MS_PER_DAY); } // test it const a = new Date("2017-01-01"), b = new Date("2017-07-25"), difference = dateDiffInDays(a, b); 

Isso funciona porque a hora UTC nunca observa o horário de verão. Consulte O UTC observa o horário de verão?

ps Depois de discutir alguns dos comentários sobre esta resposta, uma vez que você entendeu os problemas com datas de javascript que abrangem um limite de horário de verão, provavelmente há mais do que apenas uma maneira de resolvê-lo. O que eu forneci acima é uma solução simples (e testada). Eu estaria interessado em saber se existe uma solução baseada em aritmética / matemática simples em vez de ter que instanciar os dois novos objects Date. Isso poderia ser mais rápido.

Aqui está uma solução usando o moment.js :

 var a = moment('7/11/2010','M/D/YYYY'); var b = moment('12/12/2010','M/D/YYYY'); var diffDays = b.diff(a, 'days'); alert(diffDays); 

Eu usei seus valores de input originais, mas você não especificou o formato, então assumi que o primeiro valor era 11 de julho. Se foi planejado para 7 de novembro, ajuste o formato para D/M/YYYY .

 var date1 = new Date("7/11/2010"); var date2 = new Date("8/11/2010"); var diffDays = parseInt((date2 - date1) / (1000 * 60 * 60 * 24)); alert(diffDays ) 

Eu tentei muitas maneiras e descobri que usar o datepicker era o melhor, mas o formato de data causa problemas com o JavaScript ….

Então aqui está minha resposta e pode ser executado fora da checkbox.

        

um violino pode ser visto aqui DEMO

Este é o código para subtrair uma data da outra. Este exemplo converte as datas em objects, pois a function getTime () não funcionará, a menos que seja um object Date.

  var dat1 = document.getElementById('inputDate').value; var date1 = new Date(dat1)//converts string to date object alert(date1); var dat2 = document.getElementById('inputFinishDate').value; var date2 = new Date(dat2) alert(date2); var oneDay = 24 * 60 * 60 * 1000; // hours*minutes*seconds*milliseconds var diffDays = Math.abs((date1.getTime() - date2.getTime()) / (oneDay)); alert(diffDays); 

1000000% de certeza ……………