Verificar diferença de horário em Javascript

Como você verificaria a diferença de tempo de duas checkboxs de texto em JavaScript?

Improvisar. Subtrair objects JavaScript Date para obter a diferença:

 // use a constant date (eg 2000-01-01) and the desired time to initialize two dates var date1 = new Date(2000, 0, 1, 9, 0); // 9:00 AM var date2 = new Date(2000, 0, 1, 17, 0); // 5:00 PM // the following is to handle cases where the times are on the opposite side of // midnight eg when you want to get the difference between 9:00 PM and 5:00 AM if (date2 < date1) { date2.setDate(date2.getDate() + 1); } var diff = date2 - date1; // 28800000 milliseconds (8 hours) 

Você pode então converter milissegundos para hora, minuto e segundos como este:

 var msec = diff; var hh = Math.floor(msec / 1000 / 60 / 60); msec -= hh * 1000 * 60 * 60; var mm = Math.floor(msec / 1000 / 60); msec -= mm * 1000 * 60; var ss = Math.floor(msec / 1000); msec -= ss * 1000; // diff = 28800000 => hh = 8, mm = 0, ss = 0, msec = 0 

Você pode converter o tempo como string em um formato de 24 horas como este:

 function parseTime(s) { var part = s.match(/(\d+):(\d+)(?: )?(am|pm)?/i); var hh = parseInt(part[1], 10); var mm = parseInt(part[2], 10); var ap = part[3] ? part[3].toUpperCase() : null; if (ap === "AM") { if (hh == 12) { hh = 0; } } if (ap === "PM") { if (hh != 12) { hh += 12; } } return { hh: hh, mm: mm }; } parseTime("12:00 AM"); // {hh: 0, mm: 0} parseTime("12:00 PM"); // {hh: 12, mm: 0} parseTime("01:00 PM"); // {hh: 13, mm: 0} parseTime("23:00"); // {hh: 23, mm: 0} 

Essa function retorna uma cadeia com a diferença de uma cadeia de data e hora e a data e hora atual.

 function get_time_diff( datetime ) { var datetime = typeof datetime !== 'undefined' ? datetime : "2014-01-01 01:02:03.123456"; var datetime = new Date( datetime ).getTime(); var now = new Date().getTime(); if( isNaN(datetime) ) { return ""; } console.log( datetime + " " + now); if (datetime < now) { var milisec_diff = now - datetime; }else{ var milisec_diff = datetime - now; } var days = Math.floor(milisec_diff / 1000 / 60 / (60 * 24)); var date_diff = new Date( milisec_diff ); return days + " Days "+ date_diff.getHours() + " Hours " + date_diff.getMinutes() + " Minutes " + date_diff.getSeconds() + " Seconds"; } 

Testado no console do Google Chrome (pressione F12)

 get_time_diff() 1388534523123 1375877555722 "146 Days 12 Hours 49 Minutes 27 Seconds" 

Aqui está a solução que funcionou para mim:

 var date1 = new Date("08/05/2015 23:41:20"); var date2 = new Date("08/06/2015 02:56:32"); var diff = date2.getTime() - date1.getTime(); var msec = diff; var hh = Math.floor(msec / 1000 / 60 / 60); msec -= hh * 1000 * 60 * 60; var mm = Math.floor(msec / 1000 / 60); msec -= mm * 1000 * 60; var ss = Math.floor(msec / 1000); msec -= ss * 1000; alert(hh + ":" + mm + ":" + ss); 

Aqui está a minha interpretação ….

 function get_time_difference(earlierDate, laterDate) { var oDiff = new Object(); // Calculate Differences // ------------------------------------------------------------------- // var nTotalDiff = laterDate.getTime() - earlierDate.getTime(); oDiff.days = Math.floor(nTotalDiff / 1000 / 60 / 60 / 24); nTotalDiff -= oDiff.days * 1000 * 60 * 60 * 24; oDiff.hours = Math.floor(nTotalDiff / 1000 / 60 / 60); nTotalDiff -= oDiff.hours * 1000 * 60 * 60; oDiff.minutes = Math.floor(nTotalDiff / 1000 / 60); nTotalDiff -= oDiff.minutes * 1000 * 60; oDiff.seconds = Math.floor(nTotalDiff / 1000); // ------------------------------------------------------------------- // // Format Duration // ------------------------------------------------------------------- // // Format Hours var hourtext = '00'; if (oDiff.days > 0){ hourtext = String(oDiff.days);} if (hourtext.length == 1){hourtext = '0' + hourtext}; // Format Minutes var mintext = '00'; if (oDiff.minutes > 0){ mintext = String(oDiff.minutes);} if (mintext.length == 1) { mintext = '0' + mintext }; // Format Seconds var sectext = '00'; if (oDiff.seconds > 0) { sectext = String(oDiff.seconds); } if (sectext.length == 1) { sectext = '0' + sectext }; // Set Duration var sDuration = hourtext + ':' + mintext + ':' + sectext; oDiff.duration = sDuration; // ------------------------------------------------------------------- // return oDiff; } 

Uma boa solução está disponível em

http://blogs.digitss.com/javascript/calculate-datetime-difference-simple-javascript-code-snippet/

dá a saída em seu formato diferenciado desejado de

dias: horas: minutos: segundos

Uma versão ligeiramente modificada desse código é mostrada abaixo

  var vdaysdiff; // difference of the dates var vhourDiff; var vmindiff; var vsecdiff; vdaysdiff = Math.floor(diff/1000/60/60/24); // in days diff -= vdaysdiff*1000*60*60*24; vhourDiff = Math.floor(diff/1000/60/60); // in hours diff -= vhourDiff*1000*60*60; vmindiff = Math.floor(diff/1000/60); // in minutes diff -= vmindiff*1000*60; vsecdiff= Math.floor(diff/1000); // in seconds //Text formatting var hourtext = '00'; if (hourDiff > 0){ hourtext = String(hourDiff);} if (hourtext.length == 1){hourtext = '0' + hourtext}; var mintext = '00'; if (mindiff > 0){ mintext = String(mindiff);} if (mintext.length == 1){mintext = '0' + mintext}; //shows output as HH:MM ( i needed shorter duration) duration.value= hourtext + ':' + mintext; 

Esta é uma adição à resposta do dmd733 . Eu consertei o bug com a duração do Day (bem, espero ter feito, não consegui testar todos os casos).

Eu também rapidamente adicionei uma propriedade String ao resultado que mantém o tempo geral passado (desculpe pelos ifs nesteds ruins !!). Por exemplo, se usado para interface do usuário e indicando quando algo foi atualizado (como um feed RSS). Meio fora de lugar, mas bom de ter:

 function getTimeDiffAndPrettyText(oDatePublished) { var oResult = {}; var oToday = new Date(); var nDiff = oToday.getTime() - oDatePublished.getTime(); // Get diff in days oResult.days = Math.floor(nDiff / 1000 / 60 / 60 / 24); nDiff -= oResult.days * 1000 * 60 * 60 * 24; // Get diff in hours oResult.hours = Math.floor(nDiff / 1000 / 60 / 60); nDiff -= oResult.hours * 1000 * 60 * 60; // Get diff in minutes oResult.minutes = Math.floor(nDiff / 1000 / 60); nDiff -= oResult.minutes * 1000 * 60; // Get diff in seconds oResult.seconds = Math.floor(nDiff / 1000); // Render the diffs into friendly duration string // Days var sDays = '00'; if (oResult.days > 0) { sDays = String(oResult.days); } if (sDays.length === 1) { sDays = '0' + sDays; } // Format Hours var sHour = '00'; if (oResult.hours > 0) { sHour = String(oResult.hours); } if (sHour.length === 1) { sHour = '0' + sHour; } // Format Minutes var sMins = '00'; if (oResult.minutes > 0) { sMins = String(oResult.minutes); } if (sMins.length === 1) { sMins = '0' + sMins; } // Format Seconds var sSecs = '00'; if (oResult.seconds > 0) { sSecs = String(oResult.seconds); } if (sSecs.length === 1) { sSecs = '0' + sSecs; } // Set Duration var sDuration = sDays + ':' + sHour + ':' + sMins + ':' + sSecs; oResult.duration = sDuration; // Set friendly text for printing if(oResult.days === 0) { if(oResult.hours === 0) { if(oResult.minutes === 0) { var sSecHolder = oResult.seconds > 1 ? 'Seconds' : 'Second'; oResult.friendlyNiceText = oResult.seconds + ' ' + sSecHolder + ' ago'; } else { var sMinutesHolder = oResult.minutes > 1 ? 'Minutes' : 'Minute'; oResult.friendlyNiceText = oResult.minutes + ' ' + sMinutesHolder + ' ago'; } } else { var sHourHolder = oResult.hours > 1 ? 'Hours' : 'Hour'; oResult.friendlyNiceText = oResult.hours + ' ' + sHourHolder + ' ago'; } } else { var sDayHolder = oResult.days > 1 ? 'Days' : 'Day'; oResult.friendlyNiceText = oResult.days + ' ' + sDayHolder + ' ago'; } return oResult; } 

Quando eu tentei a diferença entre o mesmo carimbo de tempo que deu 0 dias 5 horas 30 minutos

Então, para obtê-lo exatamente eu subtrai 5 horas e 30 min

 function get_time_diff( datetime ) { var datetime = typeof datetime !== 'undefined' ? datetime : "2014-01-01 01:02:03.123456"; var datetime = new Date(datetime).getTime(); var now = new Date().getTime(); if( isNaN(datetime) ) { return ""; } console.log( datetime + " " + now); if (datetime < now) { var milisec_diff = now - datetime; }else{ var milisec_diff = datetime - now; } var days = Math.floor(milisec_diff / 1000 / 60 / (60 * 24)); var date_diff = new Date( milisec_diff ); return days + "d "+ (date_diff.getHours() - 5) + "h " + (date_diff.getMinutes() - 30) + "m"; } 

O tempo diff em milissegundos

 firstDate.getTime() - secondDate.getTime() 

Eu gosto de fazer isso via Epoch.

 var now = new Date(); var future = new Date(now.setMinutes(15)); var futureEpoch = moment(future).unix(); var nowEpoch = moment(now).unix(); var differenceInEpoch = nowEpoch - scheduledEpoch ; console.log("futureEpoch : " + futureEpoch); console.log("nowEpoch : " + nowEpoch); console.log("differenceInEpoch : " + differenceInEpoch); var diffTime = new Date(0); // The 0 there is the key, which sets the date to the epoch diffTime.setUTCSeconds(differenceInEpoch); console.log("new diffTime : " + diffTime); 

No meu caso, vou armazenar o tempo em milissegundos no armazenamento do Chrome e tentar encontrar o diff horas depois.

 function timeDiffInHours(milliseconds){ time_diff = (new Date).getTime() - milliseconds return parseInt((time_diff/(1000*60*60)) % 24) } // This is again sending current time and diff would be 0. timeDiffInHours((new Date).getTime()); 

Eu fiz alguns aprimoramentos para contador timer

 //example return : 01:23:02:02 // : 1 Day 01:23:02:02 // : 2 Days 01:23:02:02 function get_timeDifference(strtdatetime) { var datetime = new Date(strtdatetime).getTime(); var now = new Date().getTime(); if (isNaN(datetime)) { return ""; } //console.log(datetime + " " + now); if (datetime < now) { var milisec_diff = now - datetime; } else { var milisec_diff = datetime - now; } var days = Math.floor(milisec_diff / 1000 / 60 / (60 * 24)); var date_diff = new Date(milisec_diff); var msec = milisec_diff; var hh = Math.floor(msec / 1000 / 60 / 60); msec -= hh * 1000 * 60 * 60; var mm = Math.floor(msec / 1000 / 60); msec -= mm * 1000 * 60; var ss = Math.floor(msec / 1000); msec -= ss * 1000 var daylabel = ""; if (days > 0) { var grammar = " "; if (days > 1) grammar = "s " var hrreset = days * 24; hh = hh - hrreset; daylabel = days + " Day" + grammar ; } // Format Hours var hourtext = '00'; hourtext = String(hh); if (hourtext.length == 1) { hourtext = '0' + hourtext }; // Format Minutes var mintext = '00'; mintext = String(mm); if (mintext.length == 1) { mintext = '0' + mintext }; // Format Seconds var sectext = '00'; sectext = String(ss); if (sectext.length == 1) { sectext = '0' + sectext }; var msectext = '00'; msectext = String(msec); msectext = msectext.substring(0, 1); if (msectext.length == 1) { msectext = '0' + msectext }; return daylabel + hourtext + ":" + mintext + ":" + sectext + ":" + msectext; } 

Eu usaria apenas getTime(); e por exemplo Date.now() para retornar a diferença em milissegundos:

  //specified date: var oneDate = new Date("November 02, 2017 06:00:00"); //number of milliseconds since midnight Jan 1 1970 till specified date var oneDateMiliseconds = oneDate.getTime(); ////number of milliseconds since midnight Jan 1 1970 till now var currentMiliseconds = Date.now(); //return time difference in miliseconds alert(currentMiliseconds-oneDateMiliseconds); 

pegue os valores de input após o envio do formulário

 $start_time = $_POST('start_time'); $end_time =$_POST('end_time'); $start = $start_time; $end = $end_time; $datetime1 = new DateTime($end); $datetime2 = new DateTime($start); //echo $datetime1->format('H:i:s'); $interval = $datetime1->diff($datetime2); $elapsed = $interval->format('%h:%i'); $time = explode(":",$elapsed); $hours = $time[0]; $minutes = $time[1]; $tminutes = $minutes + ($hours*60);