Come faccio a ottenere la differenza tra due date in JavaScript?

Sto creando un’applicazione che ti consente di definire eventi con un intervallo di tempo. Voglio inserire automaticamente la data di fine quando l’utente seleziona o modifica la data di inizio. Non riesco comunque a capire come ottenere la differenza tra le due volte e come creare una nuova data di fine usando questa differenza.

In JavaScript, le date possono essere trasformate nel numero di millisecondi dall’epoc chiamando il metodo getTime() o semplicemente usando la data in un’espressione numerica.

Quindi, per ottenere la differenza, basta sottrarre le due date.

Per creare una nuova data in base alla differenza, basta passare il numero di millisecondi nel costruttore.

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

Questo dovrebbe funzionare

EDIT : corretto bug puntato da @bdukes

MODIFICA :

Per una spiegazione del comportamento, oldBegin , oldEnd e newBegin sono istanze Date . Chiamando gli operatori + e - si attiverà il lancio automatico di JavaScript e chiamerà automaticamente il metodo prototipo valueOf() di quegli oggetti. Succede che il metodo valueOf() sia implementato nell’object Date come una chiamata a getTime() .

Quindi in pratica: date.getTime() === date.valueOf() === (0 + date) === (+date)

JavaScript supporta perfettamente la differenza di date out of the box

 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'); 

Ora alcune insidie. Prova questo:

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

Quindi, se hai il rischio di aggiungere un numero e una data, converti la data in number direttamente.

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

Il mio primo esempio dimostra il potere dell’object Date, ma in realtà sembra essere una bomba ad orologeria

Vedi DEMO JsFiddle

  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); } 

per il tuo codice HTML:

 

Se non ti interessa il componente del tempo, puoi utilizzare .getDate() e .setDate() per impostare solo la parte della data.

Quindi, per impostare la data di fine a 2 settimane dopo la data di inizio, fai qualcosa di simile a questo:

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

Per restituire la differenza (in giorni) tra due date, procedere come segue:

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

Infine, modifichiamo la prima funzione in modo che possa prendere il valore restituito da 2nd come parametro:

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

Grazie a Vincent Robert , ho finito per usare il tuo esempio di base, anche se in realtà è newBegin + oldEnd - oldBegin . Ecco la soluzione finale semplificata:

  // 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)); } 

A seconda delle esigenze, questa funzione calcolerà la differenza tra i 2 giorni e restituirà un risultato in giorni decimali.

 // 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 usi moment.js, c’è una soluzione più semplice, che ti darà la differenza in giorni in una singola riga di codice.

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

Ulteriori dettagli possono essere trovati nella pagina moment.js

Saluti, 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') } 

codice esteso modificativo alternativo ..

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); } 
           

questo codice riempie la durata degli anni di studio quando inserisci la data di inizio e la data di fine (qualifica la data esatta) dello studio e controlla se la durata è inferiore a un anno se sì l’avviso di un messaggio tiene a mente ci sono tre elementi di input il primo txtFromQualifDate e secondo txtQualifDate e terzo txtStudyYears

mostrerà il risultato del numero di anni con la frazione

 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 usi gli oggetti Date e poi usi la funzione getTime() per entrambe le date, ti darà i rispettivi tempi dal 1 gennaio 1970 in un valore numerico. È quindi ansible ottenere la differenza tra questi numeri.

Se questo non ti aiuta, controlla la documentazione completa: http://www.w3schools.com/jsref/jsref_obj_date.asp

Sotto il codice restituirà i giorni rimasti da oggi alla data dei futures.

Dipendenze: 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); 

QUESTO E ‘COSA HO FATTO SUL MIO 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);