Como obtenho a diferença entre duas datas em JavaScript?

Estou criando um aplicativo que permite definir events com um período de tempo. Eu quero preencher automaticamente a data final quando o usuário seleciona ou altera a data de início. Eu não consigo descobrir, no entanto, como obter a diferença entre os dois tempos e, em seguida, como criar uma nova data final usando essa diferença.

Em JavaScript, as datas podem ser transformadas no número de milissegundos desde o epoc chamando o método getTime() ou apenas usando a data em uma expressão numérica.

Então, para obter a diferença, basta subtrair as duas datas.

Para criar uma nova data com base na diferença, basta passar o número de milissegundos no construtor.

 var oldBegin = ... var oldEnd = ... var newBegin = ... var newEnd = new Date(newBegin + oldEnd - oldBegin); 

Isso deveria funcionar

EDIT : bug corrigido apontado por @bdukes

EDITAR :

Para uma explicação do comportamento, oldBegin , oldEnd e newBegin são instâncias de Date . Operadores de chamada + e - ativarão a transmissão automática de Javascript e chamarão automaticamente o método de protótipo valueOf() desses objects. Acontece que o método valueOf() é implementado no object Date como uma chamada para getTime() .

Então, basicamente: date.getTime() === date.valueOf() === (0 + date) === (+date)

JavaScript suporta perfeitamente diferença de datas fora da checkbox

 var msMinute = 60*1000, msDay = 60*60*24*1000, a = new Date(2012, 2, 12, 23, 59, 59), b = new Date("2013 march 12"); console.log(Math.floor((b - a) / msDay) + ' full days between'); console.log(Math.floor(((b - a) % msDay) / msMinute) + ' full minutes between'); 

Agora algumas armadilhas. Tente isto:

 console.log(a - 10); console.log(a + 10); 

Portanto, se você tiver o risco de adicionar um número e uma Data, converta Data para o number diretamente.

 console.log(a.getTime() - 10); console.log(a.getTime() + 10); 

Meu primeiro exemplo demonstra o poder do object Date, mas na verdade parece ser uma bomba relógio

Veja JsFiddle DEMO

  var date1 = new Date(); var date2 = new Date("2015/07/30 21:59:00"); showDiff(); function showDiff(date1, date2){ var diff = (date2 - date1)/1000; var diff = Math.abs(Math.floor(diff)); var days = Math.floor(diff/(24*60*60)); var leftSec = diff - days * 24*60*60; var hrs = Math.floor(leftSec/(60*60)); var leftSec = leftSec - hrs * 60*60; var min = Math.floor(leftSec/(60)); var leftSec = leftSec - min * 60; document.getElementById("showTime").innerHTML = "You have " + days + " days " + hrs + " hours " + min + " minutes and " + leftSec + " seconds before death."; setTimeout(showDiff,1000); } 

para o seu código HTML:

 

Se você não se importa com o componente de tempo, você pode usar .getDate() e .setDate() para apenas definir a parte da data.

Então, para definir sua data de término para duas semanas após sua data de início, faça algo assim:

 function GetEndDate(startDate) { var endDate = new Date(startDate.getTime()); endDate.setDate(endDate.getDate()+14); return endDate; } 

Para retornar a diferença (em dias) entre duas datas, faça o seguinte:

 function GetDateDiff(startDate, endDate) { return endDate.getDate() - startDate.getDate(); } 

Finalmente, vamos modificar a primeira function para que ela possa pegar o valor retornado pelo segundo como parâmetro:

 function GetEndDate(startDate, days) { var endDate = new Date(startDate.getTime()); endDate.setDate(endDate.getDate() + days); return endDate; } 

Obrigado @ Vincent Robert , acabei usando o seu exemplo básico, embora seja realmente newBegin + oldEnd - oldBegin . Aqui está a solução final simplificada:

  // don't update end date if there's already an end date but not an old start date if (!oldEnd || oldBegin) { var selectedDateSpan = 1800000; // 30 minutes if (oldEnd) { selectedDateSpan = oldEnd - oldBegin; } newEnd = new Date(newBegin.getTime() + selectedDateSpan)); } 

Dependendo de suas necessidades, essa function calculará a diferença entre os dois dias e retornará um resultado em dias decimais.

 // This one returns a signed decimal. The sign indicates past or future. this.getDateDiff = function(date1, date2) { return (date1.getTime() - date2.getTime()) / (1000 * 60 * 60 * 24); } // This one always returns a positive decimal. (Suggested by Koen below) this.getDateDiff = function(date1, date2) { return Math.abs((date1.getTime() - date2.getTime()) / (1000 * 60 * 60 * 24)); } 

Se usar moment.js, há uma solução mais simples, que lhe dará a diferença de dias em uma única linha de código.

 moment(endDate).diff(moment(beginDate), 'days'); 

Detalhes adicionais podem ser encontrados na página moment.js

Felicidades, Miguel

 function compare() { var end_actual_time = $('#date3').val(); start_actual_time = new Date(); end_actual_time = new Date(end_actual_time); var diff = end_actual_time-start_actual_time; var diffSeconds = diff/1000; var HH = Math.floor(diffSeconds/3600); var MM = Math.floor(diffSeconds%3600)/60; var formatted = ((HH < 10)?("0" + HH):HH) + ":" + ((MM < 10)?("0" + MM):MM) getTime(diffSeconds); } function getTime(seconds) { var days = Math.floor(leftover / 86400); //how many seconds are left leftover = leftover - (days * 86400); //how many full hours fits in the amount of leftover seconds var hours = Math.floor(leftover / 3600); //how many seconds are left leftover = leftover - (hours * 3600); //how many minutes fits in the amount of leftover seconds var minutes = leftover / 60; //how many seconds are left //leftover = leftover - (minutes * 60); alert(days + ':' + hours + ':' + minutes); } 
 function checkdate() { var indate = new Date() indate.setDate(dat) indate.setMonth(mon - 1) indate.setFullYear(year) var one_day = 1000 * 60 * 60 * 24 var diff = Math.ceil((indate.getTime() - now.getTime()) / (one_day)) var str = diff + " days are remaining.." document.getElementById('print').innerHTML = str.fontcolor('blue') } 

código estendido alternativa modificitaion ..

http://jsfiddle.net/vvGPQ/48/

 showDiff(); function showDiff(){ var date1 = new Date("2013/01/18 06:59:00"); var date2 = new Date(); //Customise date2 for your required future time var diff = (date2 - date1)/1000; var diff = Math.abs(Math.floor(diff)); var years = Math.floor(diff/(365*24*60*60)); var leftSec = diff - years * 365*24*60*60; var month = Math.floor(leftSec/((365/12)*24*60*60)); var leftSec = leftSec - month * (365/12)*24*60*60; var days = Math.floor(leftSec/(24*60*60)); var leftSec = leftSec - days * 24*60*60; var hrs = Math.floor(leftSec/(60*60)); var leftSec = leftSec - hrs * 60*60; var min = Math.floor(leftSec/(60)); var leftSec = leftSec - min * 60; document.getElementById("showTime").innerHTML = "You have " + years + " years "+ month + " month " + days + " days " + hrs + " hours " + min + " minutes and " + leftSec + " seconds the life time has passed."; setTimeout(showDiff,1000); } 
           

este código preenche a duração dos anos de estudo quando você insere a data de início e término (qualificar data de vencimento) do estudo e verificar se a duração menor que um ano se sim o alerta uma mensagem tenha em mente que há três elementos de input no primeiro txtFromQualifDate e segundo txtQualifDate e terceiro txtStudyYears

mostrará o resultado do número de anos com fração

 function getStudyYears() { if(document.getElementById('txtFromQualifDate').value != '' && document.getElementById('txtQualifDate').value != '') { var d1 = document.getElementById('txtFromQualifDate').value; var d2 = document.getElementById('txtQualifDate').value; var one_day=1000*60*60*24; var x = d1.split("/"); var y = d2.split("/"); var date1=new Date(x[2],(x[1]-1),x[0]); var date2=new Date(y[2],(y[1]-1),y[0]) var dDays = (date2.getTime()-date1.getTime())/one_day; if(dDays < 365) { alert("the date between start study and graduate must not be less than a year !"); document.getElementById('txtQualifDate').value = ""; document.getElementById('txtStudyYears').value = ""; return ; } var dMonths = Math.ceil(dDays / 30); var dYears = Math.floor(dMonths /12) + "." + dMonths % 12; document.getElementById('txtStudyYears').value = dYears; } } 

Se você usar objects Date e usar a function getTime() para as duas datas, ela fornecerá os respectivos tempos desde 1º de janeiro de 1970 em um valor numérico. Você pode então obter a diferença entre esses números.

Se isso não ajudar, confira a documentação completa: http://www.w3schools.com/jsref/jsref_obj_date.asp

O código abaixo retornará os dias restantes de hoje para a data futura.

Dependências: jQuery e MomentJs.

 var getDaysLeft = function (date) { var today = new Date(); var daysLeftInMilliSec = Math.abs(new Date(moment(today).format('YYYY-MM-DD')) - new Date(date)); var daysLeft = daysLeftInMilliSec / (1000 * 60 * 60 * 24); return daysLeft; }; getDaysLeft('YYYY-MM-DD'); 
 var getDaysLeft = function (date1, date2) { var daysDiffInMilliSec = Math.abs(new Date(date1) - new Date(date2)); var daysLeft = daysDiffInMilliSec / (1000 * 60 * 60 * 24); return daysLeft; }; var date1='2018-05-18'; var date2='2018-05-25'; var dateDiff = getDaysLeft(date1, date2); console.log(dateDiff); 

ESTE É O QUE EU FEZ NO MEU SISTEMA.

 var startTime=("08:00:00").split(":"); var endTime=("16:00:00").split(":"); var HoursInMinutes=((parseInt(endTime[0])*60)+parseInt(endTime[1]))-((parseInt(startTime[0])*60)+parseInt(startTime[1])); console.log(HoursInMinutes/60);