Datas são informações essenciais em qualquer aplicação. É muito comum ter que saber qual a diferença em meses, dias, ou até mesmo segundos entre uma data e outra. Para ajudar, escrevi este passo a passo útil para qualquer caso.
Essencialmente, para descobrir a diferença entre duas datas, precisamos:
- Converter as datas em milisegundos usando getTime().
- Fazer a subtração entre as datas.
- Converter o resultado da subtração em um formato legível.
Lendo o passo a passo acima, você tem uma visão geral do processo e pode perceber que é algo simples, mas vamos aos detalhes.
Como calcular a diferença entre duas datas
Meu objetivo aqui é te ensinar a calcular a diferença entre duas datas em JavaScript sem a necessidade de nenhuma dependencia ou script externo.
Mas caso você veio até aqui buscando esse tipo de solução, existem algumas bibliotecas que te ajudam a fazer isso de forma simples. Uma delas é o Moment.js.
Usando momentjs você pode fazer:
const now = moment(new Date()); // Data de hoje
const past = moment("2014-07-07"); // Outra data no passado
const duration = moment.duration(now.diff(past));
// Mostra a diferença em dias
const days = duration.asDays();
Mas o que eu gosto mesmo é do método doityourself.js (FAÇA VOCÊ MESMO), sem dependências, pois a tarefa não é tão difícil e pra que pesar mais a minha aplicação?
Faça você mesmo: O código abaixo mostra um exemplo completo com JavaScript puro. Nos tópicos abaixo eu explico cada um dos passos e posso te ajudar caso a solução abaixo ainda não seja útil para o seu caso.
const now = new Date(); // Data de hoje
const past = new Date('2014-07-07'); // Outra data no passado
const diff = Math.abs(now.getTime() - past.getTime()); // Subtrai uma data pela outra
const days = Math.ceil(diff / (1000 * 60 * 60 * 24)); // Divide o total pelo total de milisegundos correspondentes a 1 dia. (1000 milisegundos = 1 segundo).
// Mostra a diferença em dias
console.log('Entre 07/07/2014 até agora já se passaram ' + days + ' dias');
Passo a passo de como calcular
Agora vamos quebrar o script acima em alguns passos para entendermos como funcionou a nossa conta e também mostrar outros exemplos caso você precise.
O primeiro passo é ter 2 datas, e este pode ser o passo mais chato se já não tivermos elas no formato certo, pois precisaremos que as datas sejam convertidas para um formato que nosso código seja capaz de ler, ou seja, um formato que possa ser inicializado com new Date()
e isso possa ser reconhecido como uma data.
Existem pelo menos 5 maneiras de inicializar um objeto Date em JavaScript:
// A data e horário atual
new Date();
// A data a partir de um timestamp (valor inteiro de milisegundos desde 01/01/1970)
new Date(1554539293261);
// A data inicializada a partir de outro objeto Date
var outroDia = new Date('2018-10-11 12:30');
new Date(outroDia);
// A data inicializada a partir de uma date string válida
new Date('October 11 2018 12:30');
new Date('2018-10-11 12:30');
// A data inicializada a partir do construtor de Date(ano, mes - 1, dia, hora, minuto, segundo, milisegundo)
new Date(2018, 09, 11, 12, 30);
Qualquer formato acima para inicializarmos as nossas datas é válido. Portanto se você tem uma data, ex: "30/03/2019", você não consegue transformar isso em Date() direto sem dar um "parse" antes.
Mas caso esse seja seu caso, também vou facilitar o processo de como fazer isso. Basicamente você vai precisar
// Digamos que este é o formato das suas datas
let data = '30/03/2019';
// Precisamos quebrar a string para retornar cada parte
const dataSplit = data.split('/');
const day = dataSplit[0]; // 30
const month = dataSplit[1]; // 03
const year = dataSplit[2]; // 2019
// Agora podemos inicializar o objeto Date, lembrando que o mês começa em 0, então fazemos -1.
data = new Date(year, month - 1, day);
O script acima te ajuda a converter o formato brasileiro em objeto Date. Se você precisar também da hora, minuto e segundo (ex: 30/03/2019 12:30:30), basta fazer outros dois splits (no " " e no ":"), para dividir os horários.
Fazendo a conversão se necessária nas duas datas a trabalhar, o próximo passo é o mais simples de todos, e é universal. Você precisa converter as datas em milisegundos (o método getTime() faz isso por você) e pegar a diferença entre estes dois valores.
Usaremos também o método Math.abs que retorna o valor absoluto da diferença, então não importa se eu colocar a data menor antes da maior.
// ...
const diff = Math.abs(data1.getTime() - data2.getTime());
Agora o último passo é só definir em que formato eu quero a diferença entre as datas.
No script completo eu mostrei como obter a diferença em dias, mas é possível exibir em qualquer formato. Usei também Math.ceil para arredondar para cima caso o resultado fosse fracionado.
No código acima eu fiz o seguinte cálculo:
// ...
const days = Math.ceil(diff / (1000 * 60 * 60 * 24));
// 1000 é o número de milisegundos em 1 segundo
// 60 segundos tem um minuto
// 60 minutos tem uma hora ?
// 24 horas tem um dia ??
// 1.a Multiplique tudo e você obtem o número de milisegundos em um dia.
// 1.b Use essa constante se preferir 86400000.
// 2. Divida pela diferença entre datas e você tem o número de dias
Então se eu quisesse saber a diferença em horas, bastaria dividir por 1000 * 60 * 60. Se quisesse saber em anos faria 1000 * 60 * 60 * 24 * 365, e assim por diante.
Acho que deu pra ficar bem claro até aqui. O procedimento de cálculo entre datas é bem simples na teoria. Mas é capaz que você tenha procurado este artigo pra entender como é feita a conversão. Espero ter te ajudado.