Comparar datas é algo recorrente em qualquer aplicação. Seja para verificar se são iguais, anteriores ou posteriores à outra data. Felizmente o JavaScript já possui recursos embutidos para fazer isso.
Podemos comparar datas inicializando-as como um objeto Date e usando o método getTime() com operadores de comparação. Exemplo: data1.getTime() === data2.getTime()
Confira abaixo uma explicação detalhada.
Explicando como comparar datas
Muitos desenvolvedores quando precisam fazer alguma operação com datas já vão logo adicionando Moment.js ou outra biblioteca similar, muitas vezes sem saber que o JavaScript sozinho pode muito bem realizar esse tipo de operação.
O objeto Date é a estrutura ideal em JavaScript para trabalharmos com datas. Ela possui o método getTime() que retorna uma data específica em milisegundos e pode ser universalmente usado para se trabalhar com datas, independente de timezone ou formato.
A parte mais complicada é encontrar exemplos com relação ao formato da data, principalmente para nós brasileiros que usamos o formato DD/MM/AAAA (que deveria ser o padrão!). Mas vamos ver isso logo em seguida.
O exemplo abaixo é o motivo pelo qual você veio até aqui:
// Inicializamos o objeto Date() com data e horário atual
const date1 = new Date();
// Inicializamos uma data no passado
const date2 = new Date('2018-04-07 12:30:00');
// Verificamos se primeira data é igual, maior ou menor que a segunda
if (date1.getTime() === date2.getTime()) {
console.log('As datas são iguais');
}
else if (date1.getTime() > date2.getTime()) {
console.log(date1.toString() + ' maior que ' + date2.toString());
}
else {
console.log(date1.toString() + ' menor que ' + date2.toString());
}
Pode até ser opcional o uso de getTime() em alguns casos, mas se compararmos dois objetos Date iguais, o resultado vai ser false, ex: (new Date == new Date). Por isso recomendo sempre o uso do getTime(), para compararmos os valores independente dos objetos serem distintos.
Utilizamos ===, pois esta é a forma correta de se verificar se dois valores do mesmo tipo são iguais. Ex: 1 === 1 (true), 1 === '1' (false).
Comparando somente horários
Se você precisa comparar dois horários, verificando por exemplo se 14:00 é maior que 03:00, basta inicializar o objeto Date com as datas em um mesmo dia:
// Suponhamos que as variáveis time1 e time2 vêm de um input qualquer
var time1 = '14:00';
var time2 = '03:00';
const date1 = new Date('2020-01-01 ' + time1);
const date2 = new Date('2020-01-01 ' + time2);
// Verificamos se o primeiro horário é igual, maior ou menor que o segundo
if (date1.getTime() === date2.getTime()) {
console.log('Os horários são iguais');
}
else if (date1.getTime() > date2.getTime()) {
console.log(time1 + ' maior que ' + time2);
}
else {
console.log(time1 + ' menor que ' + time2);
}
Caso queira saber a diferença entre horários retornando as horas, minutos, etc. Veja este outro artigo.
Para comparação de datas completas ou datas sem horário, a lógica é a mesma, basta que o objeto Date seja inicializado da forma correta. Veja abaixo.
Convertendo suas datas no formato certo
Se você ainda não tem as suas datas no formato certo para inicializar um objeto Date, precisamos trabalhar com a string para que possamos fazer as comparações acima.
Lembrando que existem pelo menos 5 formas de inicializar um objeto Date:
// 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(1554661034091);
// A data inicializada a partir de uma date string válida
new Date('April 04 2019 12:30:30');
new Date('2019-04-07 12:30:30');
// A data inicializada a partir de outro objeto Date
var outroDia = new Date('2019-04-07 12:30:30');
new Date(outroDia);
// A data inicializada a partir do construtor de Date(ano, mes - 1, dia, hora, minuto, segundo, milisegundo)
new Date(2019, 04, 07, 12, 30, 30);
Se a sua data está no formato 15-04-2019 ou 15/04/2019, ou ainda 15 de Abril de 2019, vamos precisar fazer uma conversão:
// Digamos que este é o formato das suas datas
let data = '15/04/2019';
// Precisamos quebrar a string para retornar cada parte
const dataSplit = data.split('/');
const day = dataSplit[0]; // 15
const month = dataSplit[1]; // 04
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);
Você pode encapsular o script acima dentro de uma função e usar nas duas datas que precisa comparar.
Se você precisar ainda converter as horas, basta fazer o split no espaço depois do ano e no ":".
Agora, se você precisa converter uma data do tipo 04 de Abril de 2019, também posso fornecer um exemplo:
let data = '15 de Abril de 2019';
// Criamos um objeto com os meses do ano
const months = { "Janeiro": 1, "Fevereiro": 2, "Março": 3, "Abril": 4 }; // ...
// Podemos quebrar as strings ' de ' para retornar ['15', 'Abril', '2019']
const dataSplit = data.split(' de ');
const day = dataSplit[0]; // 15
const month = months[dataSplit[1]]; // Abril -> 4
const year = dataSplit[2]; // 2019
// Agora podemos inicializar o objeto Date, lembre-se que o mês começa em 0, então mês - 1.
data = new Date(year, month - 1, day);
Verificando se uma data está dentro de outras 2 datas
Se você precisa verificar se por exemplo 05 de Abril está dentro de 01 de Abril e 30 de Abril, podemos usar a mesma lógica de comparação:
// Data inicio
const dateStart = new Date('2019-04-01');
// Data final
const dateEnd = new Date('2019-04-30');
// Data que vamos comparar
const dateIndex = new Date('2019-04-05');
if (dateStart.getTime() < dateIndex.getTime() && dateEnd.getTime() > dateIndex.getTime()) {
console.log('A data está contida dentro do período especificado');
}
else {
console.log('A data está fora do período especificado');
}
Como saber a diferença entre duas datas
Caso queira saber a diferença entre duas datas retornando dias, meses, anos, etc. Escrevi outro artigo sobre esse tema: https://metring.com.br/diferenca-entre-datas-em-javascript.