O jeito que as pessoas realmente fazem isso
A maioria das pessoas tenta fazer cálculo de idade na mão e acaba errando. Eu já vi planilhas com fórmulas que não consideram anos bissextos ou meses com dias diferentes, e o resultado fica meio errado depois de alguns anos. A coisa mais simples é entender o que acontece na prática. Você pega a data de nascimento, subtrai da data atual, e aí vem o detalhe: não basta subtrair os anos. Se você nasceu em 15 de março de 1990 e hoje é 10 de março de 2024, você ainda não fez aniversário esse ano. Tecnicamente tem 33 anos, não 34. Muita gente esquece disso e simplesmente divide os dias por 365. O erro parece pequeno, mas em processos legais ou sistemas bancários essa diferença pode gerar problemas reais.
Como fazer calcular idade corretamente
A lógica básica funciona assim. Compare primeiro o mês e o dia da data atual com o mês e o dia da data de nascimento. Se a data atual ainda não atingiu o aniversário no ano corrente, subtraia um ano do resultado da diferença entre os anos. Caso contrário, use a diferença direta. Em Python, por exemplo, você usaria algo como:
from datetime import date
def calcular_idade(aniversario):
hoje = date.today()
idade = hoje.year - aniversario.year
if (hoje.month, hoje.day) < (aniversario.month, aniversario.day):
idade -= 1
return idade Isso resolve 99% dos casos. Mas tem um problema que eu encontrei pessoalmente e que quase me custou um contrato. No Brasil, o sistema do governo para consulta deCPF retornava idade errada em um único cenário: quando a pessoa nascera em 29 de fevereiro e o ano atual não era bissexto. A biblioteca que eu estava usando truncava a data e considerava o aniversário como 1º de março, o que fazia a pessoa parecer um dia mais velha do que realmente era em anos normais. Para anos bissextos, o comportamento estava certo.
👉 Clique no botão abaixo para saber mais sobre o assunto!
A correção foi simples mas necessária. Quando o aniversário é 29 de fevereiro e o ano atual não é bissexto, tratei o aniversário como sendo 28 de fevereiro especificamente para o cálculo. Assim a lógica de comparação de mês e dia funcionava sem ajustar o resultado final. Se quiser verificar rapidamente se um ano é bissexto, a regra é: divisível por 4, exceto se for divisível por 100 mas não por 400. Anos como 2000 foram bissextos. 1900 não foi. 2024 foi. Se você está no Excel ou Google Sheets, a função DATEDPÉE feita pra isso. A sintaxe é =DATEDIF(data_nascimento; hoje(); "Y"). O terceiro parâmetro define a unidade. "Y" retorna anos completos. Tem também "M" para meses e "D" para dias, caso você precise de algo mais granular. O problema é que a função DATEDIF não aparece na lista de ajuda do Excel. Ela existe desde versões antigas e ninguém sabe ao certo por quê. Funciona, mas se alguém abrir sua planilha décadas depois vai ficar confuso. Deixa um comentário explicando no arquivo.
Uma pegadinha que pouca gente menciona: fuso horário. Se você nasceu às 23:50 de um dia e a consulta roda em outro fuso horário onde ainda é o dia anterior, a diferença de um dia pode ser incorporada ao cálculo de idade se a implementação não tomar cuidado com a zona horária. Em sistemas onde a data de nascimento é armazenada com hora e fuso, eu recomendo converter tudo para UTC antes de fazer a comparação. Isso elimina variações de poucos minutos que parecem besteira mas geram inconsistência em bulk processing. Outro ponto que vale anot ar: Validade jurídica. No Brasil, para fins de certidão de nascimento e documentos oficiais, o cálculo de idade segue a data civil, ou seja, a data que consta no registro. Não importa o fuso horário, não importa a hora exata do nascimento. Só a data mesmo. Se você estiver desenvolvendo um sistema para órgãos públicos ou instituições financeiras, use a data pura sem horas. Armazenar timestamp em campo de data de nascimento é pedir para ter dor de cabeça com auditoria.
Para quem quer uma solução pronta e confiável sem reinventar a roda, a biblioteca dateutil do Python tem suporte a parsing de datas que lida com bastante edge case por você. Mas se for só para uso interno, a lógica que mostrei acima cobre o básico sem dependência externa.