Número de dias de retorno de JavaScript, horas, minutos, segundos entre duas datas

Alguém pode me ligar a algum tutorial onde eu posso descobrir como retornar dias, horas, minutos, segundos em javascript entre 2 unix datetimes?

Eu tenho:

var date_now = unixtimestamp; var date_future = unixtimestamp; 

Gostaria de retornar (ao vivo) quantos dias, horas, minutos, segundos restantes do date_now para o date_future.

Basta descobrir a diferença em segundos (não se esqueça de que os timestamps do JS são realmente medidos em milissegundos) e decompor esse valor:

 // get total seconds between the times var delta = Math.abs(date_future - date_now) / 1000; // calculate (and subtract) whole days var days = Math.floor(delta / 86400); delta -= days * 86400; // calculate (and subtract) whole hours var hours = Math.floor(delta / 3600) % 24; delta -= hours * 3600; // calculate (and subtract) whole minutes var minutes = Math.floor(delta / 60) % 60; delta -= minutes * 60; // what's left is seconds var seconds = delta % 60; // in theory the modulus is not required 

Código EDIT ajustado porque eu acabei de perceber que o código original retornou o número total de horas, etc, não o número de horas restantes após a contagem de dias inteiros.

Aqui está em javascript: (Por exemplo, a data futura é o dia de ano novo)

DEMO (atualiza a cada segundo)

 var dateFuture = new Date(new Date().getFullYear() +1, 0, 1); var dateNow = new Date(); var seconds = Math.floor((dateFuture - (dateNow))/1000); var minutes = Math.floor(seconds/60); var hours = Math.floor(minutes/60); var days = Math.floor(hours/24); hours = hours-(days*24); minutes = minutes-(days*24*60)-(hours*60); seconds = seconds-(days*24*60*60)-(hours*60*60)-(minutes*60); 

Eu chamo isso de “método snowman-carl” e eu acho que é um pouco mais flexível quando você precisa de timespans adicionais como semanas, traças, anos, séculos … e não quer muito código repetitivo:

 var d = Math.abs(date_future - date_now) / 1000; // delta var r = {}; // result var s = { // structure year: 31536000, month: 2592000, week: 604800, // uncomment row to ignore day: 86400, // feel free to add your own row hour: 3600, minute: 60, second: 1 }; Object.keys(s).forEach(function(key){ r[key] = Math.floor(d / s[key]); d -= r[key] * s[key]; }); // for example: {year:0,month:0,week:1,day:2,hour:34,minute:56,second:7} console.log(r); 

Tenha um FIDDLE

Inspirado pela resposta de Alnitak .

Por favor, note que o cálculo apenas com base nas diferenças não cobrirá todos os casos: anos bissextos e comutação de “horário de verão”.

O Javascript tem uma biblioteca interna ruim para trabalhar com datas. Eu sugiro que você use uma biblioteca javascript de terceiros, por exemplo, MomentJS ; você pode ver aqui a function que você estava procurando.

A melhor biblioteca que conheço para o detalhamento de duração é o countdown.js . Ele lida com todos os casos difíceis, como anos bissextos e horário de verão, conforme csg mencionado , e até permite que você especifique conceitos difusos, como meses e semanas. Aqui está o código para o seu caso:

 //assuming these are in *seconds* (in case of MS don't multiply by 1000 below) var date_now = 1218374; var date_future = 29384744; diff = countdown(date_now * 1000, date_future * 1000, countdown.DAYS | countdown.HOURS | countdown.MINUTES | countdown.SECONDS); alert("days: " + diff.days + " hours: " + diff.hours + " minutes: " + diff.minutes + " seconds: " + diff.seconds); //or even better alert(diff.toString()); 

Aqui está um JSFiddle , mas provavelmente funcionaria apenas no FireFox ou no Chrome com a segurança da Web desabilitada, já que o countdown.js é hospedado com um tipo MIME text / plain (você deve veicular o arquivo, não linkar para countdownjs.org) .

 function update(datetime = "2017-01-01 05:11:58") { var theevent = new Date(datetime); now = new Date(); var sec_num = (theevent - now) / 1000; var days = Math.floor(sec_num / (3600 * 24)); var hours = Math.floor((sec_num - (days * (3600 * 24)))/3600); var minutes = Math.floor((sec_num - (days * (3600 * 24)) - (hours * 3600)) / 60); var seconds = Math.floor(sec_num - (days * (3600 * 24)) - (hours * 3600) - (minutes * 60)); if (hours < 10) {hours = "0"+hours;} if (minutes < 10) {minutes = "0"+minutes;} if (seconds < 10) {seconds = "0"+seconds;} return days+':'+ hours+':'+minutes+':'+seconds; } 

Aqui está um exemplo de código. Eu usei cálculos simples em vez de usar pré-cálculos como 1 dia é 86400 segundos. Então você pode seguir a lógica com facilidade.

 // Calculate time between two dates: var date1 = new Date('1110-01-01 11:10'); var date2 = new Date(); console.log('difference in ms', date1 - date2); // Use Math.abs() so the order of the dates can be ignored and you won't // end up with negative numbers when date1 is before date2. console.log('difference in ms abs', Math.abs(date1 - date2)); console.log('difference in seconds', Math.abs(date1 - date2) / 1000); var diffInSeconds = Math.abs(date1 - date2) / 1000; var days = Math.floor(diffInSeconds / 60 / 60 / 24); var hours = Math.floor(diffInSeconds / 60 / 60 % 24); var minutes = Math.floor(diffInSeconds / 60 % 60); var seconds = Math.floor(diffInSeconds % 60); var milliseconds = Math.round((diffInSeconds - Math.floor(diffInSeconds)) * 1000); console.log('days', days); console.log('hours', ('0' + hours).slice(-2)); console.log('minutes', ('0' + minutes).slice(-2)); console.log('seconds', ('0' + seconds).slice(-2)); console.log('milliseconds', ('00' + milliseconds).slice(-3)); 

Aqui está um código para encontrar a diferença entre duas datas em Dias, Horas, Minutos, Segundos (assumindo que a data futura é a data do ano novo).

 var one_day = 24*60*60*1000; // total milliseconds in one day var today = new Date(); var new_year = new Date("01/01/2017"); // future date var today_time = today.getTime(); // time in miliiseconds var new_year_time = new_year.getTime(); var time_diff = Math.abs(new_year_time - today_time); //time diff in ms var days = Math.floor(time_diff / one_day); // no of days var remaining_time = time_diff - (days*one_day); // remaining ms var hours = Math.floor(remaining_time/(60*60*1000)); remaining_time = remaining_time - (hours*60*60*1000); var minutes = Math.floor(remaining_time/(60*1000)); remaining_time = remaining_time - (minutes * 60 * 1000); var seconds = Math.ceil(remaining_time / 1000);