Quero calcular a diferença de data em dias, horas, minutos, segundos, milissegundos, nanossegundos. Como eu posso fazer isso?
javascript
datetime
Farhan Siddiqui
fonte
fonte
Respostas:
Supondo que você tenha dois
Date
objetos s, você pode simplesmente subtraí-los para obter a diferença em milissegundos:var difference = date2 - date1;
A partir daí, você pode usar aritmética simples para derivar os outros valores.
fonte
Math.floor((date2 - date1) / (1000*60*60*24))
- para a diferença em qualquer outra unidade, ajuste o denominador (o valor base está em ms).var DateDiff = { inDays: function(d1, d2) { var t2 = d2.getTime(); var t1 = d1.getTime(); return parseInt((t2-t1)/(24*3600*1000)); }, inWeeks: function(d1, d2) { var t2 = d2.getTime(); var t1 = d1.getTime(); return parseInt((t2-t1)/(24*3600*1000*7)); }, inMonths: function(d1, d2) { var d1Y = d1.getFullYear(); var d2Y = d2.getFullYear(); var d1M = d1.getMonth(); var d2M = d2.getMonth(); return (d2M+12*d2Y)-(d1M+12*d1Y); }, inYears: function(d1, d2) { return d2.getFullYear()-d1.getFullYear(); } } var dString = "May, 20, 1984"; var d1 = new Date(dString); var d2 = new Date(); document.write("<br />Number of <b>days</b> since "+dString+": "+DateDiff.inDays(d1, d2)); document.write("<br />Number of <b>weeks</b> since "+dString+": "+DateDiff.inWeeks(d1, d2)); document.write("<br />Number of <b>months</b> since "+dString+": "+DateDiff.inMonths(d1, d2)); document.write("<br />Number of <b>years</b> since "+dString+": "+DateDiff.inYears(d1, d2));
Amostra de código retirada daqui .
fonte
Outra solução é converter a diferença para um novo objeto Date e obter o ano dessa data (diff de 1970), mês, dia, etc.
var date1 = new Date(2010, 6, 17); var date2 = new Date(2013, 12, 18); var diff = new Date(date2.getTime() - date1.getTime()); // diff is: Thu Jul 05 1973 04:00:00 GMT+0300 (EEST) console.log(diff.getUTCFullYear() - 1970); // Gives difference as year // 3 console.log(diff.getUTCMonth()); // Gives month count of difference // 6 console.log(diff.getUTCDate() - 1); // Gives day count of difference // 4
Portanto, a diferença é como "3 anos e 6 meses e 4 dias". Se você quiser entender a diferença em um estilo legível por humanos, isso pode ajudá-lo.
fonte
Expressões como "diferença de dias" nunca são tão simples quanto parecem. Se você tem as seguintes datas:
d1: 2011-10-15 23:59:00 d1: 2011-10-16 00:01:00
a diferença de tempo é de 2 minutos, a "diferença em dias" deve ser 1 ou 0? Problemas semelhantes surgem para qualquer expressão da diferença em meses, anos ou qualquer outra coisa, já que anos, meses e dias são de durações e horários diferentes (por exemplo, o dia em que o horário de verão começa é 1 hora mais curto do que o normal e duas horas mais curto do que o dia que termina).
Aqui está uma função para uma diferença de dias que ignora a hora, ou seja, para as datas acima, retorna 1.
/* Get the number of days between two dates - not inclusive. "between" does not include the start date, so days between Thursday and Friday is one, Thursday to Saturday is two, and so on. Between Friday and the following Friday is 7. e.g. getDaysBetweenDates( 22-Jul-2011, 29-jul-2011) => 7. If want inclusive dates (e.g. leave from 1/1/2011 to 30/1/2011), use date prior to start date (i.e. 31/12/2010 to 30/1/2011). Only calculates whole days. Assumes d0 <= d1 */ function getDaysBetweenDates(d0, d1) { var msPerDay = 8.64e7; // Copy dates so don't mess them up var x0 = new Date(d0); var x1 = new Date(d1); // Set to noon - avoid DST errors x0.setHours(12,0,0); x1.setHours(12,0,0); // Round to remove daylight saving errors return Math.round( (x1 - x0) / msPerDay ); }
Isso pode ser mais conciso:
/* Return number of days between d0 and d1. ** Returns positive if d0 < d1, otherwise negative. ** ** e.g. between 2000-02-28 and 2001-02-28 there are 366 days ** between 2015-12-28 and 2015-12-29 there is 1 day ** between 2015-12-28 23:59:59 and 2015-12-29 00:00:01 there is 1 day ** between 2015-12-28 00:00:01 and 2015-12-28 23:59:59 there are 0 days ** ** @param {Date} d0 - start date ** @param {Date} d1 - end date ** @returns {number} - whole number of days between d0 and d1 ** */ function daysDifference(d0, d1) { var diff = new Date(+d1).setHours(12) - new Date(+d0).setHours(12); return Math.round(diff/8.64e7); } // Simple formatter function formatDate(date){ return [date.getFullYear(),('0'+(date.getMonth()+1)).slice(-2),('0'+date.getDate()).slice(-2)].join('-'); } // Examples [[new Date(2000,1,28), new Date(2001,1,28)], // Leap year [new Date(2001,1,28), new Date(2002,1,28)], // Not leap year [new Date(2017,0,1), new Date(2017,1,1)] ].forEach(function(dates) { document.write('From ' + formatDate(dates[0]) + ' to ' + formatDate(dates[1]) + ' is ' + daysDifference(dates[0],dates[1]) + ' days<br>'); });
fonte
<html lang="en"> <head> <script> function getDateDiff(time1, time2) { var str1= time1.split('/'); var str2= time2.split('/'); // yyyy , mm , dd var t1 = new Date(str1[2], str1[0]-1, str1[1]); var t2 = new Date(str2[2], str2[0]-1, str2[1]); var diffMS = t1 - t2; console.log(diffMS + ' ms'); var diffS = diffMS / 1000; console.log(diffS + ' '); var diffM = diffS / 60; console.log(diffM + ' minutes'); var diffH = diffM / 60; console.log(diffH + ' hours'); var diffD = diffH / 24; console.log(diffD + ' days'); alert(diffD); } //alert(getDateDiff('10/18/2013','10/14/2013')); </script> </head> <body> <input type="button" onclick="getDateDiff('10/18/2013','10/14/2013')" value="clickHere()" /> </body> </html>
fonte
use Moment.js para todos os cálculos de data e hora relacionados ao JavaScript
A resposta à sua pergunta é:
var a = moment([2007, 0, 29]); var b = moment([2007, 0, 28]); a.diff(b) // 86400000
Detalhes completos podem ser encontrados aqui
fonte
function DateDiff(date1, date2) { date1.setHours(0); date1.setMinutes(0, 0, 0); date2.setHours(0); date2.setMinutes(0, 0, 0); var datediff = Math.abs(date1.getTime() - date2.getTime()); // difference return parseInt(datediff / (24 * 60 * 60 * 1000), 10); //Convert values days and return value }
fonte
Com momentjs é simples:
moment("2016-04-08").fromNow();
fonte
var d1=new Date(2011,0,1); // jan,1 2011 var d2=new Date(); // now var diff=d2-d1,sign=diff<0?-1:1,milliseconds,seconds,minutes,hours,days; diff/=sign; // or diff=Math.abs(diff); diff=(diff-(milliseconds=diff%1000))/1000; diff=(diff-(seconds=diff%60))/60; diff=(diff-(minutes=diff%60))/60; days=(diff-(hours=diff%24))/24; console.info(sign===1?"Elapsed: ":"Remains: ", days+" days, ", hours+" hours, ", minutes+" minutes, ", seconds+" seconds, ", milliseconds+" milliseconds.");
fonte
Desculpe, mas o cálculo fixo em milissegundos não é confiável. Obrigado por todas as respostas, mas algumas das funções que tentei falharam em 1. Uma data próxima à data de hoje 2. Uma data em 1970 ou 3. Uma data em um ano bissexto.
Abordagem que melhor funcionou para mim e cobre todos os cenários, por exemplo, ano bissexto, data próxima em 1970, 29 de fevereiro etc.
var someday = new Date("8/1/1985"); var today = new Date(); var years = today.getFullYear() - someday.getFullYear(); // Reset someday to the current year. someday.setFullYear(today.getFullYear()); // Depending on when that day falls for this year, subtract 1. if (today < someday) { years--; } document.write("Its been " + years + " full years.");
fonte
function DateDiff(b, e) { let endYear = e.getFullYear(), endMonth = e.getMonth(), years = endYear - b.getFullYear(), months = endMonth - b.getMonth(), days = e.getDate() - b.getDate(); if (months < 0) { years--; months += 12; } if (days < 0) { months--; days += new Date(endYear, endMonth, 0).getDate(); } return [years, months, days]; } [years, months, days] = DateDiff( new Date("October 21, 1980"), new Date("July 11, 2017")); // 36 8 20
fonte
[years, months, days] = DateDiff( new Date("October 21, 2019"), new Date("October 18, 2020")); // 1 -1 27 // 0 11 27 <- should be this
... Para corrigir isso, adicione a(months < 0)
condição novamente abaixo da linha demonths--;
Se você estiver usando o moment.js, será muito simples encontrar a diferença de data.
var now = "04/09/2013 15:00:00"; var then = "04/09/2013 14:20:30"; moment.utc(moment(now,"DD/MM/YYYY HH:mm:ss").diff(moment(then,"DD/MM/YYYY HH:mm:ss"))).format("HH:mm:ss")
fonte
Eu acho que isso deve bastar.
let today = new Date(); let form_date=new Date('2019-10-23') let difference=form_date>today ? form_date-today : today-form_date let diff_days=Math.floor(difference/(1000*3600*24))
fonte
É assim que você pode implementar a diferença entre datas sem uma estrutura.
function getDateDiff(dateOne, dateTwo) { if(dateOne.charAt(2)=='-' & dateTwo.charAt(2)=='-'){ dateOne = new Date(formatDate(dateOne)); dateTwo = new Date(formatDate(dateTwo)); } else{ dateOne = new Date(dateOne); dateTwo = new Date(dateTwo); } let timeDiff = Math.abs(dateOne.getTime() - dateTwo.getTime()); let diffDays = Math.ceil(timeDiff / (1000 * 3600 * 24)); let diffMonths = Math.ceil(diffDays/31); let diffYears = Math.ceil(diffMonths/12); let message = "Difference in Days: " + diffDays + " " + "Difference in Months: " + diffMonths+ " " + "Difference in Years: " + diffYears; return message; } function formatDate(date) { return date.split('-').reverse().join('-'); } console.log(getDateDiff("23-04-2017", "23-04-2018"));
fonte
function daysInMonth (month, year) { return new Date(year, month, 0).getDate(); } function getduration(){ let A= document.getElementById("date1_id").value let B= document.getElementById("date2_id").value let C=Number(A.substring(3,5)) let D=Number(B.substring(3,5)) let dif=D-C let arr=[]; let sum=0; for (let i=0;i<dif+1;i++){ sum+=Number(daysInMonth(i+C,2019)) } let sum_alter=0; for (let i=0;i<dif;i++){ sum_alter+=Number(daysInMonth(i+C,2019)) } let no_of_month=(Number(B.substring(3,5)) - Number(A.substring(3,5))) let days=[]; if ((Number(B.substring(3,5)) - Number(A.substring(3,5)))>0||Number(B.substring(0,2)) - Number(A.substring(0,2))<0){ days=Number(B.substring(0,2)) - Number(A.substring(0,2)) + sum_alter } if ((Number(B.substring(3,5)) == Number(A.substring(3,5)))){ console.log(Number(B.substring(0,2)) - Number(A.substring(0,2)) + sum_alter) } time_1=[]; time_2=[]; let hour=[]; time_1=document.getElementById("time1_id").value time_2=document.getElementById("time2_id").value if (time_1.substring(0,2)=="12"){ time_1="00:00:00 PM" } if (time_1.substring(9,11)==time_2.substring(9,11)){ hour=Math.abs(Number(time_2.substring(0,2)) - Number(time_1.substring(0,2))) } if (time_1.substring(9,11)!=time_2.substring(9,11)){ hour=Math.abs(Number(time_2.substring(0,2)) - Number(time_1.substring(0,2)))+12 } let min=Math.abs(Number(time_1.substring(3,5))-Number(time_2.substring(3,5))) document.getElementById("duration_id").value=days +" days "+ hour+" hour " + min+" min " }
<input type="text" id="date1_id" placeholder="28/05/2019"> <input type="text" id="date2_id" placeholder="29/06/2019"> <br><br> <input type="text" id="time1_id" placeholder="08:01:00 AM"> <input type="text" id="time2_id" placeholder="00:00:00 PM"> <br><br> <button class="text" onClick="getduration()">Submit </button> <br><br> <input type="text" id="duration_id" placeholder="days hour min">
fonte
com base na implementação de protótipo de tempo de execução javascript, você pode usar aritmética simples para subtrair datas como abaixo
var sep = new Date(2020, 07, 31, 23, 59, 59); var today = new Date(); var diffD = Math.floor((sep - today) / (1000 * 60 * 60 * 24)); console.log('Day Diff: '+diffD);
a diferença retorna a resposta em milissegundos, então você deve convertê-la por divisão:
fonte
isso deve funcionar bem se você só precisa mostrar o tempo restante, já que o JavaScript usa frames para o seu tempo, você terá seu End Time - O tempo RN depois disso, podemos dividi-lo por 1000, pois aparentemente 1000 frames = 1 segundo, depois disso, você pode usar a matemática básica do tempo, mas ainda há um problema com este código, uma vez que o cálculo é estático, ele não pode compensar o total de dias diferentes em um ano (360/365/366), o monte de SE após o cálculo for torná-lo nulo se o tempo for inferior a 0, espero que isso ajude, embora não seja exatamente o que você está perguntando :)
var now = new Date(); var end = new Date("End Time"); var total = (end - now) ; var totalD = Math.abs(Math.floor(total/1000)); var years = Math.floor(totalD / (365*60*60*24)); var months = Math.floor((totalD - years*365*60*60*24) / (30*60*60*24)); var days = Math.floor((totalD - years*365*60*60*24 - months*30*60*60*24)/ (60*60*24)); var hours = Math.floor((totalD - years*365*60*60*24 - months*30*60*60*24 - days*60*60*24)/ (60*60)); var minutes = Math.floor((totalD - years*365*60*60*24 - months*30*60*60*24 - days*60*60*24 - hours*60*60)/ (60)); var seconds = Math.floor(totalD - years*365*60*60*24 - months*30*60*60*24 - days*60*60*24 - hours*60*60 - minutes*60); var Y = years < 1 ? "" : years + " Years "; var M = months < 1 ? "" : months + " Months "; var D = days < 1 ? "" : days + " Days "; var H = hours < 1 ? "" : hours + " Hours "; var I = minutes < 1 ? "" : minutes + " Minutes "; var S = seconds < 1 ? "" : seconds + " Seconds "; var A = years == 0 && months == 0 && days == 0 && hours == 0 && minutes == 0 && seconds == 0 ? "Sending" : " Remaining"; document.getElementById('txt').innerHTML = Y + M + D + H + I + S + A;
fonte
Ok, existem várias maneiras de fazer isso. Sim, você pode usar o antigo JS. Apenas tente:
let dt1 = new Date() let dt2 = new Date()
Vamos emular a passagem usando Date.prototype.setMinutes e ter certeza de que estamos dentro do alcance.
dt1.setMinutes(7) dt2.setMinutes(42) console.log('Elapsed seconds:',(dt2-dt1)/1000)
Como alternativa, você pode usar alguma biblioteca como js-joda , onde pode facilmente fazer coisas como esta (diretamente dos documentos):
var dt1 = LocalDateTime.parse("2016-02-26T23:55:42.123"); var dt2 = dt1 .plusYears(6) .plusMonths(12) .plusHours(2) .plusMinutes(42) .plusSeconds(12); // obtain the duration between the two dates dt1.until(dt2, ChronoUnit.YEARS); // 7 dt1.until(dt2, ChronoUnit.MONTHS); // 84 dt1.until(dt2, ChronoUnit.WEEKS); // 356 dt1.until(dt2, ChronoUnit.DAYS); // 2557 dt1.until(dt2, ChronoUnit.HOURS); // 61370 dt1.until(dt2, ChronoUnit.MINUTES); // 3682242 dt1.until(dt2, ChronoUnit.SECONDS); // 220934532
Existem muitas outras bibliotecas ofc, mas js-joda tem um bônus adicional por estar disponível também em Java, onde foi amplamente testado. Todos esses testes foram migrados para js-joda, também é imutável.
fonte