Resolvendo problemas comuns com datas no JavaScript
Veja como resolver os problemas mais comuns com datas utilizando JavaScript
Neste artigo você vai ver vários exemplos de como resolver problemas comuns com datas no JavaScript. Não utilizaremos nenhuma biblioteca nos exemplos deste artigo. Em todos estes exemplos vamos utilizar o objeto Date.
O que você vai aprender?
Adicionar dias ou meses a uma data
Calcular a diferença de dias entre duas datas.
Retornar qual o dia da semana de uma data.
Retornar a quantidade de semanas entre duas datas.
Diferença entre duas datas em dias, horas, minutos e segundos.
Retornar um intervalo de datas
Retornar dias uteis de um intervalo de datas.
Adicionar dias ou meses a uma data
Para adicionar meses ou dias a uma data podemos criar uma nova data utilizando o objeto Date e adicicionar o período desejado utilizando os método SET e GET do objeto Date. Veja os exemplos a seguir:
var data_inicial = new Date(2023, 0, 1, 0, 0 , 0);
var nova_data1 = new Date(data_inicial);
nova_data1.setMonth(nova_data1.getMonth() + 13);
console.log(nova_data1);
Para criar a data inicial utilizamos o construtor do objeto Date, neste exemplo o construtor recebeu como parâmetros o ano, mes, dia, hora, minuto e segundo. No caso do mês, os meses são no intervalo de 0 a 11, ou seja, janeiro é o mês zero.
Utilizando o método setMonth do objeto Date podemos adicionar ou subtrair meses desta data. Para retornar o mês atual utilizamos o método getMonth(). No exemplo que acabamos de ver adicionamos 13 meses ao mês atual. O resultado obtido foi 01 de fevereiro de 2024.
Outros exemplos de manipulação de datas:
var data_inicial = new Date(2023, 0, 1, 0, 0 , 0);
var nova_data2 = new Date(data_inicial);
nova_data2.setDate(nova_data2.getDate() + 2);
console.log(nova_data2);
var nova_data3 = new Date(data_inicial);
nova_data3.setYear(nova_data3.getFullYear() + 1);
console.log(nova_data3);
var nova_data4 = new Date(data_inicial);
nova_data4.setDate(nova_data4.getDate() - 1);
console.log(nova_data4);
Os métodos getFullYear, getMonth e getDate retornam respectivamente o ano, mês e dia. Já os métodos setYear, setMonth e setDate permitem alterar o ano. mês e dia da instância do objeto Date.
Você pode, ao invés de passar os parâmetros da data para o construtor do objeto Date, enviar uma string no formato ano-mês-diaThora:minutos:segundos.
var data_inicial = new Date("2023-01-01T00:00:00");
var nova_data4 = new Date(data_inicial);
nova_data4.setDate(nova_data4.getDate() - 1);
console.log(nova_data4);
Uma observação: Quando o ano for bissexto e a data for 29 de fevereiro, o comportamento destes métodos ´acaba não sendo o esperado. Confirma o código a seguir:
var data_inicial = new Date("2024-02-29T00:00:00");
var nova_data1 = new Date(data_inicial);
nova_data1.setMonth(nova_data1.getMonth() + 1);
console.log(nova_data1);
var nova_data3 = new Date(data_inicial);
nova_data3.setYear(nova_data3.getFullYear() + 1);
console.log(nova_data3);
var nova_data4 = new Date(data_inicial);
nova_data4.setDate(nova_data4.getDate() + 1);
console.log(nova_data4);
A adição de 1 ano a esta data retorno primeiro de março do ano seguinte. A adição de 1 dia e de 1 mês funcionaram corretamente. Anos bissextos são aqueles múltiplos de 4. Por outro lado, esses anos não são múltiplos de 100, exceto os múltiplos de 400. Veja a seguir um exemplo de código que verifica se o ano é bissexto.
var ano = 2023;
var resultado1 = (ano % 100 === 0) ? (ano % 400 === 0) : (ano % 4 === 0);
console.log(resultado1);
var ano2 = 2024;
var resultado2 = (ano2 % 100 === 0) ? (ano2 % 400 === 0) : (ano2 % 4 === 0);
console.log(resultado2);
A verificação para o ano de 2023 retornou false e a verificação para o ano de 2024 retornou true porque este ano é bissexto.
Calcular a diferença de dias entre duas datas
Para o cálculo da diferença de dias vamos novamente utilizar o objeto Date. Para isso, vamos passar uma string contendo a data no formato ano-mes-dia.
var data1 = "2023-01-01";
var data2 = "2023-04-10";
var data_inicial = new Date(data1)
var data_final = new Date(data2);
var diferenca = data_final - data_inicial;
console.log(diferenca);
Ao executar o código acima o retorno foi o número 8553600000. No JavaScript as datas são calculadas conforme a quantidade de milissegundos a partir de 01/01/1970 00:00:00 GMT-0. Ao subtrair as duas datas, o resultado é a diferença entre as datas em milissegundos.
Para converter em datas, precisamos dividir pela quantidade de milissegundos de um dia. Um dia possui 86.400.000 Nosso código atualizado ficará da seguinte forma:
var data1 = "2023-01-01";
var data2 = "2023-04-10";
var data_inicial = new Date(data1)
var data_final = new Date(data2);
var dia_milissegundos = ((60 * 60) * 24) * 1000;
var diferenca = (data_final - data_inicial)/dia_milissegundos;
console.log(diferenca);
O resultado obtido foi 99, que á diferença de dias entre as duas datas.
Retornar qual o dia da semana de uma data
Para retornar o dia da semana podemos utilizar o método getDay() do objeto Date. Vamos utilizar o mesmo intervalo de datas do exemplo anterior.
var data1 = "2023-01-01";
var data2 = "2023-04-10";
var data_inicial = new Date(data1)
var data_final = new Date(data2);
console.log(data_inicial.getDay());
console.log(data_final.getDay());
O resultado retornado foi 6 para a primeira data e 0 para a segunda. O método getDay() retorna um número de 0 a 6, sendo 0 se refere ao domingo e 6 é referente ao sábado. Para tornar a resposta mais amigável, vamos criar um array contendo os dias da semana. Nosso código atualizado ficará da seguinte forma:
var semana = ["Domingo", "Segunda-Feira", "Terça-Feira", "Quarta-Feira", "Quinta-Feira", "Sexta-Feira", "Sábado"];
var data1 = "2023-01-01";
var data2 = "2023-04-10";
var data_inicial = new Date(data1)
var data_final = new Date(data2);
console.log(semana[data_inicial.getDay()]);
console.log(semana[data_final.getDay()]);
Retornar a quantidade de semanas entre duas datas.
Como já sabemos, ao subtrair duas datas o JavaScript nos retorna um número que é quantidade de milissegundos. Para calcular a diferença de dias entre duas datas fizemos a divisão deste resultado pela quantidade de milissegundos existente em um dia. Utilizando a mesma lógica, faremos a divisão deste resultado pelo número de milissegundos de uma semana. Faremos uma pequena adaptação no primeiro exemplo deste artigo.
var data1 = "2023-01-01";
var data2 = "2023-04-10";
var data_inicial = new Date(data1)
var data_final = new Date(data2);
var dia_milissegundos = ((60 * 60) * 24) * 1000;
var semana_millisegundos = dia_milissegundos * 6;
var diferenca = (data_final - data_inicial)/semana_millisegundos;
console.log(diferenca);
Perceba que o resultado foi 16.5, que é o número de semanas que separa as duas datas. Seria melhor que o retorno fosse um número inteiro, para isso vamos ajustar o cálculo da diferença utilizando o objeto Math. Utilizando o método ceil podemos arredondar para cima o resultado.
var data1 = "2023-01-01";
var data2 = "2023-04-10";
var data_inicial = new Date(data1)
var data_final = new Date(data2);
var dia_milissegundos = ((60 * 60) * 24) * 1000;
var semana_millisegundos = dia_milissegundos * 6;
var diferenca = (data_final - data_inicial)/semana_millisegundos;
console.log(Math.ceil(diferenca));
Diferença entre duas datas em dias, horas, minutos e segundos.
Até o momento estamos trabalhando com datas sem informar a horá. No proxímo exemplo vamos ver duas datas com horas e vamos retornar o resultado em dias, horas, minutos e segundos.
var segundos_dia = 86400;
var segundos_hora = 3600.
var data1 = "2023-01-01 09:30:45";
var data2 = "2023-04-10 22:10:15";
var data_inicial = new Date(data1)
var data_final = new Date(data2);
var total_segundos = (data_final - data_inicial) / 1000;
var dias = Math.floor(total_segundos / segundos_dia);
total_segundos -= dias * segundos_dia;
var horas = Math.floor(total_segundos / segundos_hora) % 24;
total_segundos -= horas * segundos_hora;
var minutos = Math.floor(total_segundos / 60) % 60;
total_segundos -= minutos * 60;
var segundos = total_segundos % 60;
console.log("A diferença entre as datas é " + dias + "dias, "+ horas + "horas, "+ minutos + "minutos e "+ segundos + "segundos");
Vamos a explicação do código. Como vimos, o Javascript nos retorna a quantidade de milissegundos quando subtraimos duas datas criadas com o objeto Date. Foi criada uma variável chamada total_segundos, com o total de segundos entre as duas datas, perceba que para converter de milissegundos para segundos fizemos a divisão por 1000. No exemplo trabalhamos com segundo para facilitar nosso cálculo.
Para o cálculo de dias, horas e minutos, fizemos a divisão do total de segundos pela quantidade de segundos de um dia, hora e minuto. Perceba que em cada operação reduzimos este valor da varíavel total_segundos. Utilizamos o método floor do objeto Math, arredondamos os resultados das operações para baixo.
Retornar um intervalo de datas
Neste exemplo vamos ver como criar um array contendo todas as datas a partir de um data inicial e final.
var data1 = "2023-01-01";
var data2 = "2023-04-10";
var data_inicial = new Date(data1)
var data_final = new Date(data2);
var resultados = [];
var data_inicio = data_inicial;
while (data_inicio <= data_final) {
var data = new Date(data_inicio);
var data_formatada = data.toISOString().slice(0,10);
resultados.push(data_formatada);
data_inicio.setUTCDate(data_inicio.getUTCDate() + 1);
}
console.log(resultados);
Para preencher o array resultados com as datas entre a data inicial e final utilizamos uma estrutura de repetição While, a cada interação acrescentamos um dia a data inicial somando 1 ao método getUTCDate da data que está sendo iterada. Para guardar a data no array resultados utilizamos o método push. Perceba que dentro do array estamos guardando uma string no formato ano-mes-dia. O objeto Date possui um método chamado toISOString que retorna uma string no formato data-hora. Utilizando o método slice da string de data, retornamos apenas os 10 primeiros caracteres, que é a informação referente a data.
Retornar dias uteis de um intervalo de datas.
Como último exemplo, vamos retornar a quantidade de dias úteis de dois intervalos de data. A solução será parecida com o exemplo anterior, a diferença vai ver que antes de fazer o push vamos verificar se a data não é sábado ou domingo.
var data1 = "2023-01-01T00:00:00";
var data2 = "2023-04-10T00:00:00";
var data_inicial = new Date(data1)
var data_final = new Date(data2);
var resultados = [];
var data_inicio = data_inicial;
var final_semana = [0,6];
while (data_inicio <= data_final) {
var data = new Date(data_inicio);
if (!final_semana.includes(data.getDay())){
var data_formatada = data.toISOString().slice(0,10);
resultados.push(data_formatada);
}
data_inicio.setUTCDate(data_inicio.getUTCDate() + 1);
}
console.log(resultados);
Percena que ao contrário do exemplo anterior, informamos o horário. Criamos um array chamado final_semana, contendo 0 e 6. O método getDate(), que retorna o número correspondente ao dia da semana, retorna 0 quando é domingo e 6 quando é sábado. Desta forma, antes de fazer o push no array utilizamos um if para verificar se o dia da semana da data atual não existe no array. Se não existir, adicionamos ao array de resultados.
Com certeza você percebeu que esta não é resposta correta. Faltou considerar os feriados. Será necessário criar um array de feriados e depois remover os elementos de resultados que existirem no array de feriados. Nosso código ficará assim:
var data1 = "2023-01-01T00:00:00";
var data2 = "2023-04-10T00:00:00";
var data_inicial = new Date(data1)
var data_final = new Date(data2);
var resultados = [];
var data_inicio = data_inicial;
var final_semana = [0,6];
var feriados = ["2023-01-01", "2023-02-20", "2023-02-21", "2023-04-07", "2023-04-09", "2023-04-21", "2023-05-01", "2023-06-08", "2023-09-07", "2023-10-12", "2023-11-02", "2023-11-15", "2023-12-24"];
while (data_inicio <= data_final) {
var data = new Date(data_inicio);
if (!final_semana.includes(data.getDay())){
var data_formatada = data.toISOString().slice(0,10);
resultados.push(data_formatada);
}
data_inicio.setUTCDate(data_inicio.getUTCDate() + 1);
}
var resultados_final = resultados.filter(function(el) {
return !feriados.includes(el);
});
console.log("O total de dias úteis é " + resultados_final.length);
console.log(resultados_final);
Para compor o resultado final aplicamos o método filter ao array resultados. Este método retorna um novo array de acordo com uma condição, em nosso caso informamos que queriamos as datas que não existissem no array de feriados. Para contar a quantidade de itens do resultado final, utilizamos o método length do array.
Conclusão
Neste artigo você viu operações comuns com datas utilizando JavaScript.
Se você achou este assunto interessante pode gostar do link a seguir