Contador De Idade - Calculadora de Idade Online | Quantos Anos Tenho? | YouWare
Calculadora de Idade Online | Quantos Anos Tenho? | YouWare

Como calcular a idade exata em JavaScript

Muita gente faz a conta errada. O jeito mais comum que você vê na internet é pegar o ano atual e subtrair o ano de nascimento. Isso funciona na maioria das vezes, mas falha todo mês de aniversário se a data ainda não chegou. Eu já vi isso quebrar sistemas de cadastro, relatórios financeiros e até fluxos de promoção que dependem da faixa etária do usuário. O problema é que o cálculo de idade não é só uma diferença de anos — ele precisa considerar mês e dia também.

contador de idade: como fazer funcionar direito

O que você precisa fazer é comparar três coisas: ano, mês e dia. Se o mês de nascimento ainda não chegou no mês atual, ou se o mês já chegou mas o dia também ainda não, você subtrai um ano do resultado. É isso. Nada de biblioteca externa, nada de complexidade desnecessária. Aqui está o código que eu uso, simples e direto:

function calcularIdade(dataNascimento) {
  const hoje = new Date();
  const nascimento = new Date(dataNascimento);
  let idade = hoje.getFullYear() - nascimento.getFullYear();
  const diferencaMes = hoje.getMonth() - nascimento.getMonth();
  if (diferencaMes < 0 || (diferencaMes === 0 && hoje.getDate() nascimento.getDate())) {
    idade--;
  }
  return idade;
}

Tem um detalhe que quase ninguém leva em conta: o construtor Date recebe datas em UTC se você passar strings no formato ISO (2000-01-01), mas o mês em JavaScript é indexado em zero. Ou seja, janeiro é 0 e dezembro é 11. Isso causa confusão quando você usa getMonth() sem perceber. Se você testar a data 1990-02-28 com o código acima numa máquina num fuso horário diferente, pode obter um resultado errado em casos extremos. A solução é sempre trabalhar com o fuso horário local de forma consistente. Um caso específico que me deu dor de cabeça: um cliente tinha um sistema onde o aniversário de alguns usuários caía no dia 29 de fevereiro. Em anos não bissextos, o código simples comparava o dia 29 com a data atual que era 28 de fevereiro e achava que a pessoa ainda não havia feito aniversário. A correção que eu fiz foi verificar se a data de nascimento era 29/02 e, nesse caso, tratar como se o aniversário fosse em 28 de fevereiro nos anos não bissextos. Ficou assim:

👉 Clique no botão abaixo para saber mais sobre o assunto!

function calcularIdade(dataNascimento) {
  const hoje = new Date();
  const nascimento = new Date(dataNascimento);
  let idade = hoje.getFullYear() - nascimento.getFullYear();
  let mesNasc = nascimento.getMonth();
  let diaNasc = nascimento.getDate();
  if (mesNasc === 1 && diaNasc === 29) {
    if (hoje.getFullYear() % 4 !== 0) {
      diaNasc = 28;
    }
  }
  const diferencaMes = hoje.getMonth() - mesNasc;
  if (diferencaMes < 0 || (diferencaMes === 0 && hoje.getDate() diaNasc)) {
    idade--;
  }
  return idade;
}

Isso resolveu o problema. A partir daí, passei a usar esse bloco em todos os projetos, independentemente do tamanho. Outro ponto importante: se você estiver trabalhando com datas vindas do backend em timestamp Unix (em segundos), precisa multiplicar por 1000 antes de passar para o construtor Date. Timestamps sem essa conversão geram datas completamente fora do esperado — normalmente no ano de 1970 ou anterior. Já perdi horas debuggando isso em um projeto onde os dados vinham de uma API legada.

Se você não quer escrever esse código manualmente, existem bibliotecas como date-fns e moment.js, mas para algo tão simples eu prefiro não adicionar dependência. O overhead não vale a pena. Para projetos grandes onde a manipulação de datas é constante, o date-fns é uma opção razoável. A função equivalente seria differenceInYears(dateA, dateB), que já lida com a lógica de forma correta internamente. Limitações desse tipo de abordagem: ela funciona para datas modernas, mas se você precisar calcular idade para alguém nascido antes de 1900, ou em calendários não-gregorianos, aí sim você precisa de uma biblioteca especializada. A API de datas do JavaScript simplesmente não suporta esses casos. Para a grande maioria dos cenários — cadastro de usuário, verificação de maioridade, filtros por faixa etária — o código acima resolve sem complicação.

Se quiser testar rápido, pode colar a função num console do navegador, passando uma string como "1995-06-15" e verificando se o retorno bate com o cálculo manual. Leva dois minutos e evita dor de cabeça depois.