Trabalhando com Datas em JavaScript

Trabalhar com datas e horários é uma necessidade frequente no desenvolvimento web. No JavaScript, o objeto nativo Date fornece uma série de métodos que permitem criar, acessar e manipular datas e horas de forma eficiente. Neste artigo, vamos explorar as principais funcionalidades do Date, apresentando exemplos práticos que vão te ajudar a entender como lidar com datas no dia a dia da programação.
Criando uma data
Para criar um objeto de data em JavaScript, utilizamos o construtor new Date(). Quando chamado sem nenhum parâmetro, ele gera um objeto que representa a data e hora atual, baseada no relógio do sistema.
let data = new Date();
console.log(data); // 2025-06-02T19:29:06.438Z
O construtor Date aceita diferentes tipos de argumentos. Um deles é um número inteiro que representa o timestamp, ou seja, a quantidade de milissegundos decorridos desde 1º de janeiro de 1970, às 00:00:00 UTC — conhecido como Época Unix. Valores positivos correspondem a datas posteriores a essa referência, enquanto valores negativos representam datas anteriores a 01/01/1970.
// horas * minutos * segundos * milisegundos = 1 dias
let umDiaAntes = new Date( - 24 * 60 * 60 * 1000);
let inicio = new Date( 0 );
let umDiaDepois = new Date( 24 * 60 * 60 * 1000);
console.log(umDiaAntes); // 1969-12-31T00:00:00.000Z
console.log(inicio); // 1970-01-01T00:00:00.000Z
console.log(umDiaDepois); // 1970-01-02T00:00:00.000Z
Também é possível obter o timestamp de um objeto Date utilizando o método .getTime().
let agora = new Date();
console.log(agora.getTime()); // 1748893183318
Quando passamos uma string como argumento para o construtor Date, ela é convertida para uma data. O JavaScript segue, por padrão, o formato ISO 8601, que tem a seguinte estrutura:
YYYY-MM-DDTHH:mm:ss.sssZ
Onde:
YYYY– Ano com quatro dígitos (de 0000 a 9999).MM– Mês com dois dígitos (de 01 a 12). O valor padrão é 01DD– Dia do mês com dois dígitos (de 01 a 31). O valor padrão é 01.T– Um caractere literal que separa a data da hora. Ele é obrigatório quando a parte de hora é informada.HH– Hora no formato de 24 horas (de 00 a 23). Existe um caso especial onde 24:00:00 é válido e representa a meia-noite. O valor padrão é 00.mm– Minutos, com dois dígitos (de 00 a 59). O valor padrão é 00.ss– Segundos, com dois dígitos (de 00 a 59). O valor padrão é 00.sss– Milissegundos, com três dígitos (de 000 a 999). O valor padrão é 000.Z– Indica o fuso horário. Pode ser o literal Z (que significa UTC) ou um deslocamento no formato +HH:mm ou -HH:mm, representando a diferença em relação ao horário UTC.
Nem todas as partes do formato precisam ser informadas — elas podem ser omitidas. Caso a string não siga exatamente o padrão ISO 8601, o construtor Date tentará interpretar a data de outras formas. No entanto, é importante destacar que formatos diferentes podem gerar resultados inconsistentes, dependendo do ambiente ou do navegador.
let data1 = new Date('2024-03-10');
let data2 = new Date('2024-03-10T15:30:31');
let data3 = new Date('2023-12-07T00:30:31.000Z');
let data4 = new Date('2023-12-07T00:30:31-03:00');
let data5 = new Date('01/01/2025');
let data6 = new Date('01/01/2025 10:30');
let data7 = new Date('Wed Jan 01 2025 00:00:00 GMT-0300');
let data8 = new Date('abc');
console.log(data1); // 2024-03-10T00:00:00.000Z
console.log(data2); // 2024-03-10T18:30:31.000Z
console.log(data3); // 2023-12-07T00:30:31.000Z
console.log(data4);// 2023-12-07T03:30:31.000Z
console.log(data5);// 2025-01-01T03:00:00.000Z
console.log(data6);// 2025-01-01T13:30:00.000Z
console.log(data7);// 2025-01-01T03:00:00.000Z
console.log(data8);// Invalid Date
Também é possível criar uma data passando seus componentes separadamente como números para o construtor Date. A ordem dos parâmetros é:
new Date(year, month, day, hours, minutes, seconds, milliseconds)
Dos parâmetros, apenas os dois primeiros — ano (year) e mês (month) — são obrigatórios. Os demais são opcionais e, caso não sejam informados, assumem o valor zero (ou um, no caso do dia).
🛑 Atenção: o mês é baseado em índice zero, ou seja:
0representa janeiro1representa fevereiro- …
11representa dezembro
let data1 = new Date(2025, 1);
let data2 = new Date(2025, 1 , 15);
let data3 = new Date(2025, 1 , 15, 10, 30, 21);
console.log(data1); // 2025-02-01T03:00:00.000Z
console.log(data2); // 2025-02-15T03:00:00.000Z
console.log(data3); // 2025-02-15T13:30:21.000Z
Observação: Um comportamento interessante do construtor Date é que ele faz ajustes automáticos quando algum valor está fora do intervalo válido. Por exemplo, se informarmos o dia 32 para um mês que possui apenas 31 dias, o JavaScript automaticamente ajusta a data para o dia 1 do mês seguinte. Esse comportamento também se aplica para horas, minutos e outros componentes que excedam seus limites.
let data1 = new Date(2025, 0 , 32);
let data2 = new Date(2025, 0 , 0);
let data3 = new Date(2025, 12 , 1);
let data4 = new Date(2025, 11 , 1, 24);
console.log(data1); // 2025-02-01T03:00:00.000Z
console.log(data2); // 2024-12-31T03:00:00.000Z
console.log(data3); // 2026-01-01T03:00:00.000Z
console.log(data4); // 2025-12-02T03:00:00.000Z
Acessando os componentes da data
A classe Date nos fornece métodos para acessar cada uma das partes.
getFullYear(): Retorna o ano completo com quatro dígitos. Ex.: 2025getMonth(): Retorna o mês, onde janeiro é 0 e dezembro é 11. ⚠️ Atenção: esse índice começa em zero!getDate(): Retorna o dia do mês, de 1 a 31. retorna o dia do mês, de 1 até 31. Cuidado: nome do método não é muito intuitivo, e pode ser confundido com o métodogetDay().getDay(): Retorna o dia da semana, onde: 0 = Domingo, 1 = Segunda, …, 6 = SábadogetHours(): Retorna a hora, no formato de 0 a 23.getMinutes(): Retorna os minutos, de 0 a 59.getSeconds(): Retorna os segundos, de 0 a 59.getMilliseconds(): Retorna os milissegundos, de 0 a 999.getTime(): Retorna o timestamp, ou seja, o valor numérico em milissegundos desde 01/01/1970 (Epoch).getTimezoneOffset(): Retorna o deslocamento do fuso horário, em minutos, em relação ao UTC.
➝ Ex.: Se você está no horário de Brasília (UTC-3), ele retorna 180.
let data = new Date('2025-02-03T10:11:12.123-03:00');
console.log(data.getFullYear()); // 2025
console.log(data.getMonth()); // 1 - lembre-se os meses começam em 0 então 1 é fevereiro aqui
console.log(data.getDate()); // 3
console.log(data.getHours()); // 10
console.log(data.getMinutes()); // 11
console.log(data.getSeconds()); // 12
console.log(data.getMilliseconds()); // 123
console.log(data.getDay()); // 1
console.log(data.getTime()); // 1738588272123
console.log(data.getTimezoneOffset()); // 180
Os métodos que vimos até aqui consideram sempre o fuso horário local, definido no ambiente onde o código está sendo executado ou na string da data. Porém, se precisarmos acessar os componentes da data no horário de referência UTC — equivalente ao fuso UTC+0 —, a classe Date oferece uma versão de cada método com o sufixo UTC.
Basta adicionar UTC ao nome do método, como por exemplo:
getUTCFullYear()getUTCHours()getUTCMinutes()
Esses métodos retornam os valores da data e hora sem considerar o fuso local, sempre com base no horário UTC.
let data = new Date('2025-02-03T10:11:12.123-03:00');
console.log(data.getHours()); // 10
console.log(data.getUTCHours()); // 13
Alterando as datas
Para alterar uma data, a classe Date disponibiliza diversos métodos sets, permitindo modificar individualmente os diferentes componentes da data, como ano, mês, dia, horas, minutos, segundos e milissegundos.
setFullYear(year, [month], [date])setMonth(month, [date])setDate(date)setHours(hour, [min], [sec], [ms])setMinutes(min, [sec], [ms])setSeconds(sec, [ms])setMilliseconds(ms)setTime(milliseconds)
Alguns métodos de alteração permitem modificar mais de um componente da data ao mesmo tempo. Por exemplo, o método setMonth() altera o mês e, opcionalmente, também pode definir o dia do mês se um segundo parâmetro for informado.
let data = new Date('2025-02-03T10:11:12.123-03:00');
data.setFullYear(2026);
data.setMonth(0);
data.setDate(25);
data.setHours(16);
data.setMinutes(20);
data.setSeconds(5);
data.setMilliseconds(321);
console.log(data); // 2026-01-25T19:20:05.321Z
Assim como os métodos gets, os métodos sets também possuem uma verser UTC.
let data = new Date('2025-02-03T10:11:12.123-03:00');
data.setHours(16);
console.log(data); // 2025-02-03T19:11:12.123Z
data.setUTCHours(16);
console.log(data); // 2025-02-03T16:11:12.123Z
Como no construtor, os métodos set também aplicam a auto-correção de datas. Isso significa que, ao definir valores fora dos limites convencionais — como um dia 32 ou um mês 13 — o JavaScript ajusta automaticamente para a data correta. Esse comportamento nos permite somar ou subtrair meses, dias, horas e outros componentes de forma simples e prática.
let data = new Date('2025-02-03T10:11:12.123-03:00');
data.setDate( data.getDate() + 7); // adiciona 7 dias a data
console.log(data); // 2025-02-10T13:11:12.123Z
data.setMonth( data.getMonth() - 3); // subtrai 3 meses
console.log(data); // 2024-11-10T13:11:12.123Z
Importante: os métodos set são mutáveis, ou seja, eles alteram diretamente o objeto Date original. Se quisermos preservar a data inicial, é necessário criar uma cópia do objeto antes de realizar qualquer modificação.
let data = new Date('2025-02-03T10:11:12.123-03:00');
let data10Dias = new Date( data.getTime() );
data10Dias.setDate( data10Dias.getDate() + 10);
console.log(data); // 2025-02-03T13:11:12.123Z
console.log(data10Dias); // 2025-02-13T13:11:12.123Z
Comparando Datas
Como objetos Date podem ser convertidos para valores numéricos — mais especificamente, para o timestamp em milissegundos desde 01/01/1970 — comparar datas em JavaScript se torna uma tarefa bastante simples.
let data1 = new Date('2024-01-30T15:13:12.123-03:00');
let data2 = new Date('2025-02-03T10:11:12.123-03:00');
if( data1 < data2 ){
console.log("data 1 é anterior")
}
Diferença entre datas
Assim como a comparação entre datas é simples graças à conversão dos objetos Date em valores numéricos, calcular a diferença entre duas datas também é bem fácil. Basta subtrair uma data da outra, e o resultado será a diferença em milissegundos. A partir disso, com alguns cálculos, podemos converter esse valor para segundos, minutos, horas, dias ou qualquer outra unidade de tempo.
let data1 = new Date('2024-01-30T15:13:12.123-03:00');
let data2 = new Date('2025-02-04T10:11:12.123-03:00');
let mili = data2 - data1;
let segundos = (data2 - data1) / 1000;
let minutos = (data2 - data1) / (60 * 1000);
let horas = (data2 - data1) / (60 * 60 * 1000);
let dias = (data2 - data1) / (24 * 60 * 60 * 1000);
console.log(mili); // 32036280000
console.log(segundos); // 32036280
console.log(minutos); // 533938
console.log(horas); // 8898.966666666667
console.log(dias); // 370.79027777777776
Formatando Datas
A classe Date oferece alguns métodos que permitem formatar datas de forma simples e direta.
toLocaleDateString(): retorna a data formatada conforme as convenções do locale (idioma e região) especificado.
let hoje = new Date();
console.log(hoje.toLocaleDateString("pt-BR")); // 03/06/2025
console.log(hoje.toLocaleDateString("en-US")); // 6/3/2025
toISOString(): toISOString(): retorna a data representada no padrão ISO 8601, no formato UTC.
let agora= new Date();
console.log( agora.toISOString() ); // 2025-06-03T13:45:08.018Z
Para criar uma formatação mais personalizada de datas, podemos utilizar o objeto Intl.DateTimeFormat. Ele permite formatar datas e horas levando em consideração a localidade, além de oferecer várias opções para customizar o formato de saída.
let agora = new Date();
const formater = new Intl.DateTimeFormat("pt-BR", {
dateStyle: "short",
timeStyle: "short",
});
console.log( formater.format(agora) ); // 03/06/2025, 10:58
const formater2 = new Intl.DateTimeFormat("pt-BR", {
month: 'long',
day: '2-digit'
});
console.log( formater2.format(agora)); // 03 de junho
Abaixo segue as principais opções de formatação disponíveis:
weekday: Exibe o dia da semana.
- Valores possíveis:
"narrow","short","long" - Exemplo:
"segunda-feira"
year: Exibe o ano.
- Valores possíveis:
"numeric","2-digit" - Exemplo:
"2025"ou"25"
month: Exibe o mês.
- Valores possíveis:
"numeric","2-digit","narrow","short","long" - Exemplo:
"6","06","jun","junho"
day: Exibe o dia do mês.
- Valores possíveis:
"numeric","2-digit" - Exemplo:
"3"ou"03"
hour, minute, second: Exibem as respectivas partes do tempo.
- Valores possíveis:
"numeric","2-digit" - Exemplo:
"16"ou"04"
hour12: Define o uso de formato de 12 horas.
- Valores possíveis:
true,false - Exemplo:
truepara formato AM/PM
dayPeriod: Exibe o período do dia.
- Valores possíveis:
"narrow","short","long" - Exemplo:
"AM","PM"
fractionalSecondDigits: Define o número de dígitos para frações de segundo.
- Valores possíveis:
1,2,3
dateStyle e timeStyle: Atalhos para definir estilos de data e hora.
- Valores possíveis:
"full","long","medium","short"
Conclusão
A classe Date do JavaScript é uma ferramenta robusta e essencial para o trabalho com datas e horários. Apesar de algumas peculiaridades e métodos que podem gerar confusão, com prática e cuidado é perfeitamente possível dominá-la e utilizá-la de forma eficiente em seus projetos.
T++
