Datas em JavaScript
O JavaScript usa o objeto Date para trabalhar com datas e horas. Pense nele como um relógio digital — mostra a hora atual, permite definir qualquer momento e pode calcular a diferença entre dois horários.
📖 Resumo
Criando Objetos Date
Quatro formas comuns de criar uma Date:
<script>
console.log(new Date()); // Data e hora atuais
console.log(new Date("2025-06-19")); // String de data
console.log(new Date(2025, 5, 19, 10, 30, 0)); // Ano, mês, dia, horas, minutos, segundos
console.log(new Date(1718764800000)); // Timestamp (milissegundos)
</script>
Pegadinha importante: Meses começam do zero! 0 = janeiro, 11 = dezembro. Em new Date(2025, 5, 19), o 5 significa junho, não maio. Essa é provavelmente a decisão de design mais criticada do objeto Date — sem discussão.
Obtendo Data e Hora
| Método | Retorna | Observação |
|---|---|---|
getFullYear() |
Ano com 4 dígitos | Não use getYear() — está obsoleto |
getMonth() |
0–11 | Some 1 para o mês real |
getDate() |
1–31 | Dia do mês |
getDay() |
0–6 | 0 = Domingo, não segunda! |
getHours() |
0–23 | — |
getMinutes() |
0–59 | — |
getSeconds() |
0–59 | — |
getDay() retorna o dia da semana, não o dia do mês — use getDate() para isso. Iniciantes frequentemente confundem.
Definindo Data e Hora
Existe um conjunto correspondente de métodos set: setFullYear(), setMonth(), setDate(), setHours(), setMinutes(), setSeconds(). Valores ultrapassam automaticamente:
<script>
const d = new Date(2025, 5, 19);
d.setDate(32); // Vira automaticamente 2 de julho
console.log(d.toLocaleDateString());
</script>
Formatando Datas
| Método | Exemplo de Saída |
|---|---|
toLocaleDateString() |
"19/06/2025" |
toLocaleTimeString() |
"10:30:00" |
toLocaleString() |
"19/06/2025 10:30:00" |
Esses métodos formatam automaticamente com base na localidade do navegador.
Timestamps e Cálculo de Diferenças de Tempo
Um timestamp é a quantidade de milissegundos decorridos desde 1º de janeiro de 1970 00:00:00 UTC.
<script>
console.log(Date.now()); // Obtém o timestamp atual
console.log(new Date().getTime()); // Igual ao acima
</script>
A abordagem principal para calcular diferenças de tempo: subtrair dois timestamps para obter a diferença em milissegundos, depois converter:
<script>
const inicio = Date.now();
for (let i = 0; i < 1000000; i++) {} // Simula alguma operação
const fim = Date.now();
const diff = fim - inicio; // Milissegundos
const diffSegundos = diff / 1000; // Segundos
console.log("Tempo decorrido: " + diff + "ms (" + diffSegundos + " segundos)");
</script>
Exemplo: Exibindo Data e Hora Atual
<!DOCTYPE html>
<html lang="pt-br">
<head>
<meta charset="UTF-8">
<title>Data e Hora Atual</title>
<style>
body { font-family: sans-serif; padding: 20px; text-align: center; }
.clock { display: inline-block; padding: 24px 40px; background: #1a1a2e; color: #e0e0e0; border-radius: 12px; }
.time { font-size: 48px; font-weight: bold; color: #00d4ff; font-family: monospace; }
.date { font-size: 20px; margin-top: 8px; color: #a0a0c0; }
</style>
</head>
<body>
<h2>Relógio ao Vivo</h2>
<div class="clock">
<div class="time" id="time">--:--:--</div>
<div class="date" id="date">----/--/--</div>
</div>
<script>
function atualizarRelogio() {
const agora = new Date();
const h = String(agora.getHours()).padStart(2, "0");
const m = String(agora.getMinutes()).padStart(2, "0");
const s = String(agora.getSeconds()).padStart(2, "0");
document.getElementById("time").textContent = `${h}:${m}:${s}`;
const ano = agora.getFullYear();
const mes = String(agora.getMonth() + 1).padStart(2, "0");
const dia = String(agora.getDate()).padStart(2, "0");
const diasSemana = ["Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sáb"];
document.getElementById("date").textContent = `${ano}-${mes}-${dia} ${diasSemana[agora.getDay()]}`;
}
atualizarRelogio();
setInterval(atualizarRelogio, 1000);
</script>
</body>
</html>
Exemplo: Detalhes das Informações de Data
<!DOCTYPE html>
<html lang="pt-br">
<head>
<meta charset="UTF-8">
<title>Informações de Data</title>
<style>
body { font-family: sans-serif; padding: 20px; }
table { border-collapse: collapse; margin: 16px 0; }
td, th { border: 1px solid #ddd; padding: 10px 16px; text-align: left; }
th { background: #4a90d9; color: #fff; }
.note { background: #fff8e1; padding: 12px; border-radius: 6px; border-left: 4px solid #f0ad4e; margin: 16px 0; }
</style>
</head>
<body>
<h2>Valores Retornados pelos Métodos do Objeto Date</h2>
<div id="output"></div>
<script>
const agora = new Date();
const dados = [
["getFullYear()", agora.getFullYear(), "Ano com 4 dígitos"],
["getMonth()", agora.getMonth(), "0-11 (some 1 para o mês real)"],
["getDate()", agora.getDate(), "1-31 (dia do mês)"],
["getDay()", agora.getDay(), "0-6 (0 = Domingo)"],
["getHours()", agora.getHours(), "0-23"],
["getMinutes()", agora.getMinutes(), "0-59"],
["getSeconds()", agora.getSeconds(), "0-59"],
["getTime()", agora.getTime(), "Timestamp (milissegundos)"],
];
document.getElementById("output").innerHTML = `
<table>
<tr><th>Método</th><th>Valor Retornado</th><th>Descrição</th></tr>
${dados.map(r => `<tr><td><code>${r[0]}</code></td><td>${r[1]}</td><td>${r[2]}</td></tr>`).join("")}
</table>
<div class="note">
<strong>Meses começam do zero</strong>: getMonth() retorna ${agora.getMonth()}, mas o mês real é ${agora.getMonth()+1}.
<strong>getDay() é o dia da semana</strong>: retorna ${agora.getDay()} (${["Dom","Seg","Ter","Qua","Qui","Sex","Sáb"][agora.getDay()]}), não a data!
</div>
`;
</script>
</body>
</html>
Exemplo: Timer de Contagem Regressiva
<!DOCTYPE html>
<html lang="pt-br">
<head>
<meta charset="UTF-8">
<title>Contagem Regressiva</title>
<style>
body { font-family: sans-serif; padding: 20px; text-align: center; }
.countdown { display: inline-block; padding: 24px; background: linear-gradient(135deg, #667eea, #764ba2); color: #fff; border-radius: 12px; margin: 16px 0; }
.countdown h3 { margin: 0 0 12px; font-size: 18px; }
.timer { display: flex; gap: 16px; justify-content: center; }
.unit { text-align: center; }
.number { font-size: 40px; font-weight: bold; font-family: monospace; }
.label { font-size: 12px; opacity: 0.8; }
.input-row { margin: 16px 0; }
input { padding: 8px 12px; font-size: 16px; border: 2px solid #ccc; border-radius: 6px; }
button { padding: 8px 20px; font-size: 16px; border: none; border-radius: 6px; cursor: pointer; background: #4a90d9; color: #fff; }
button:hover { background: #357abd; }
</style>
</head>
<body>
<h2>Contagem Regressiva até a Data Alvo</h2>
<div class="input-row">
<input type="datetime-local" id="target" />
<button id="startBtn">Iniciar Contagem</button>
</div>
<div class="countdown" id="countdown" style="display:none;">
<h3 id="targetLabel">Tempo restante</h3>
<div class="timer">
<div class="unit"><div class="number" id="days">0</div><div class="label">Dias</div></div>
<div class="unit"><div class="number" id="hours">0</div><div class="label">Horas</div></div>
<div class="unit"><div class="number" id="minutes">0</div><div class="label">Min</div></div>
<div class="unit"><div class="number" id="seconds">0</div><div class="label">Seg</div></div>
</div>
</div>
<script>
const alvoPadrao = new Date();
alvoPadrao.setDate(alvoPadrao.getDate() + 7);
const dataStr = alvoPadrao.toISOString().slice(0, 16);
document.getElementById("target").value = dataStr;
let timer = null;
document.getElementById("startBtn").addEventListener("click", function() {
const alvo = new Date(document.getElementById("target").value);
if (isNaN(alvo.getTime())) {
alert("Selecione uma data e hora válidas");
return;
}
document.getElementById("countdown").style.display = "inline-block";
document.getElementById("targetLabel").textContent =
`Tempo até ${alvo.toLocaleString()}`;
if (timer) clearInterval(timer);
function atualizar() {
const agora = Date.now();
const diff = alvo.getTime() - agora;
if (diff <= 0) {
document.getElementById("days").textContent = "0";
document.getElementById("hours").textContent = "0";
document.getElementById("minutes").textContent = "0";
document.getElementById("seconds").textContent = "0";
document.getElementById("targetLabel").textContent = "Tempo esgotado!";
clearInterval(timer);
return;
}
const dias = Math.floor(diff / (1000 * 60 * 60 * 24));
const horas = Math.floor((diff % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
const minutos = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60));
const segundos = Math.floor((diff % (1000 * 60)) / 1000);
document.getElementById("days").textContent = dias;
document.getElementById("hours").textContent = String(horas).padStart(2, "0");
document.getElementById("minutes").textContent = String(minutos).padStart(2, "0");
document.getElementById("seconds").textContent = String(segundos).padStart(2, "0");
}
atualizar();
timer = setInterval(atualizar, 1000);
});
</script>
</body>
</html>
Exemplo: Calculadora de Diferença de Datas
<!DOCTYPE html>
<html lang="pt-br">
<head>
<meta charset="UTF-8">
<title>Diferença de Datas</title>
<style>
body { font-family: sans-serif; padding: 20px; }
.calc { max-width: 500px; margin: 16px auto; }
.row { margin: 12px 0; }
label { display: inline-block; width: 100px; font-weight: bold; }
input { padding: 8px 12px; font-size: 16px; border: 2px solid #ccc; border-radius: 6px; }
button { padding: 8px 20px; font-size: 16px; border: none; border-radius: 6px; cursor: pointer; background: #5cb85c; color: #fff; margin-top: 8px; }
button:hover { background: #449d44; }
.result { margin-top: 16px; padding: 16px; background: #f0f7ff; border-radius: 8px; border: 2px solid #4a90d9; }
.result div { margin: 4px 0; }
</style>
</head>
<body>
<h2 style="text-align:center;">Calculadora de Diferença de Datas</h2>
<div class="calc">
<div class="row">
<label>Data Início:</label>
<input type="date" id="start" />
</div>
<div class="row">
<label>Data Fim:</label>
<input type="date" id="end" />
</div>
<div style="text-align:center;">
<button id="calcBtn">Calcular</button>
</div>
<div class="result" id="result" style="display:none;"></div>
</div>
<script>
const hoje = new Date();
const mesPassado = new Date();
mesPassado.setMonth(mesPassado.getMonth() - 1);
document.getElementById("start").value = mesPassado.toISOString().slice(0, 10);
document.getElementById("end").value = hoje.toISOString().slice(0, 10);
document.getElementById("calcBtn").addEventListener("click", function() {
const inicio = new Date(document.getElementById("start").value);
const fim = new Date(document.getElementById("end").value);
if (isNaN(inicio.getTime()) || isNaN(fim.getTime())) {
alert("Selecione datas válidas");
return;
}
const diffMs = Math.abs(fim - inicio);
const diffDias = Math.floor(diffMs / (1000 * 60 * 60 * 24));
const diffHoras = Math.floor(diffMs / (1000 * 60 * 60));
const diffMinutos = Math.floor(diffMs / (1000 * 60));
const diffSemanas = Math.floor(diffDias / 7);
document.getElementById("result").style.display = "block";
document.getElementById("result").innerHTML = `
<div><strong>Dias:</strong> ${diffDias}</div>
<div><strong>Horas:</strong> ${diffHoras}</div>
<div><strong>Minutos:</strong> ${diffMinutos}</div>
<div><strong>Aproximadamente:</strong> ${diffSemanas} semanas e ${diffDias % 7} dias</div>
`;
});
</script>
</body>
</html>
❓ Perguntas Frequentes
P: Por que
getMonth()precisa somar 1? R: Porque a classeDatedo Java foi projetada assim, e o JavaScript herdou essa "tradição." Todo mundo concorda que é um design bobo, mas não pode ser alterado — código demais depende desse comportamento. É só memorizar.
P: Existe diferença entre
new Date("2025-06-19")enew Date(2025, 5, 19)? R: Sim. Datas em string são interpretadas como UTC à meia-noite, enquanto a forma com parâmetros usa horário local. A hora exibida pode diferir em 3 horas (para UTC-3). Se você só se importa com a data e não com a hora, a forma com parâmetros é mais segura.
P: Como calcular a idade de alguém? R: Subtraia o ano de nascimento do ano atual, depois verifique se o aniversário já passou este ano: se o mês atual for menor que o mês de nascimento, ou se os meses forem iguais mas o dia atual for menor que o dia de nascimento, subtraia 1 da idade.
📝 Atividades
- Escreva uma função
formatarData(data)que retorne uma string no formato"AAAA-MM-DD (DiaDaSemana)". Certifique-se de que meses e dias tenham zero à esquerda. - Escreva uma função
obterIdade(aniversario)que receba uma string de data (ex: "2000-03-15") e retorne a idade atual em anos completos. - Construa um recurso de "tempo atrás": dada uma data passada, exiba "X anos, X meses, X dias atrás" ou "X dias atrás" ou "X horas atrás" — escolhendo automaticamente o formato apropriado com base na diferença de tempo.



