Módulo 14 - Datas e expressões regulares

Cálculos com datas

10 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 01/07/2026

O que você vai aprender

  • Entender o que é uma duração e como o timedelta a representa.
  • Somar e subtrair dias de uma data com segurança.
  • Calcular a diferença entre duas datas e ler o resultado em dias.
  • Descobrir a idade de alguém em dias a partir da data de nascimento.

Duração é um tipo à parte

Existe uma diferença sutil, mas importante, entre uma data e uma duração. Uma data é um ponto no tempo: 2 de julho de 2026. Uma duração é um intervalo: 30 dias, sem começo nem fim definidos. O Python separa esses conceitos em tipos diferentes. A data é date ou datetime; a duração é timedelta. Você cria um timedelta dizendo quanto tempo ele representa, por exemplo timedelta(days=30) para trinta dias, e então soma ou subtrai esse intervalo de uma data.

from datetime import date, timedelta

hoje = date(2026, 7, 2)
uma_semana = timedelta(days=7)

futuro = hoje + uma_semana
passado = hoje - uma_semana

print(futuro)   # 2026-07-09  (7 dias depois)
print(passado)  # 2026-06-25  (7 dias antes)

# O Python cuida da virada de mes sozinho:
fim_do_mes = date(2026, 7, 31) + timedelta(days=1)
print(fim_do_mes)  # 2026-08-01

Somar ou subtrair um timedelta de uma data devolve outra data. A virada de mês é automática.

Repare no último exemplo: somar um dia a 31 de julho leva para 1 de agosto, sem que você precise saber que julho tem 31 dias. Esse é o grande ganho. O timedelta e o tipo de data cuidam de todas as regras chatas do calendário, incluindo meses de 28, 30 e 31 dias e até anos bissextos. Você pensa em dias; o Python pensa no resto. Além de days, o timedelta aceita weeks, hours, minutes e seconds, então dá para expressar quase qualquer intervalo.

Quantos dias entre duas datas

A operação mais útil talvez seja a inversa: você tem duas datas e quer saber quanto tempo há entre elas. Basta subtrair uma da outra. O resultado não é um número solto, e sim um timedelta, aquele tipo de duração. Para ler o total em dias, use o atributo .days do resultado. Se a primeira data for mais tarde que a segunda, o número de dias vem positivo; se for mais cedo, vem negativo. Isso é ótimo para calcular prazos, contagens regressivas e tempo decorrido.

from datetime import date

hoje = date(2026, 7, 2)
natal = date(2026, 12, 25)

faltam = natal - hoje       # isto e um timedelta
print(faltam)               # 176 days, 0:00:00
print(faltam.days)          # 176  (numero inteiro de dias)

print(f"Faltam {faltam.days} dias para o Natal.")
# Faltam 176 dias para o Natal.

# Ordem invertida da diferenca negativa:
print((hoje - natal).days)  # -176

Subtrair duas datas devolve um timedelta; .days extrai o total de dias como inteiro.

Calculando a idade em dias

Um exemplo clássico junta tudo: calcular há quantos dias uma pessoa nasceu. Você tem a data de nascimento e a data de hoje; a idade em dias é simplesmente a diferença entre as duas, lida com .days. Como today() dá a data atual, o cálculo se atualiza sozinho a cada dia que passa. Vale lembrar que idade em anos é mais delicada, porque depende de a pessoa já ter feito aniversário no ano corrente, mas idade em dias é direta e exata.

from datetime import date

nascimento = date(2000, 3, 15)
hoje = date(2026, 7, 2)

idade = hoje - nascimento
print(idade.days)   # 9606  (dias vividos ate 02/07/2026)

# Idade aproximada em anos (divisao inteira por 365):
anos = idade.days // 365
print(f"Cerca de {anos} anos de vida.")  # Cerca de 26 anos de vida.

# Proximo aniversario neste ano:
aniversario = date(hoje.year, nascimento.month, nascimento.day)
print(aniversario)  # 2026-03-15

Idade em dias é a diferença direta; dividir por 365 dá uma estimativa de anos.

A divisão inteira dos dias por 365 dá uma estimativa boa de anos, mas repare que é aproximada: ela ignora os anos bissextos, que têm 366 dias. Para a maioria dos usos do dia a dia, essa aproximação basta. Se você precisar da idade exata em anos, o caminho é comparar o mês e o dia de hoje com o mês e o dia do nascimento, subtraindo um ano quando a pessoa ainda não fez aniversário. Fica como um bom desafio para depois, mas o essencial desta aula é claro: com timedelta, contas de calendário deixam de ser um pesadelo.

Teste rápido

Você subtraiu duas datas e guardou em dif. Como pega o número inteiro de dias entre elas?

Perguntas frequentes

Por que a subtração de duas datas não dá logo um número?
Porque o resultado é uma duração, e o Python representa duração com o tipo timedelta, que carrega dias, segundos e microssegundos. Isso é mais rico que um número solto. Para o total de dias, leia o atributo .days do timedelta.
Posso somar meses com timedelta, tipo timedelta(months=1)?
Não. O timedelta aceita days, weeks, hours, minutes e seconds, mas não months nem years, porque mês e ano têm tamanhos variáveis. Para somar meses de forma exata, usa-se uma biblioteca externa (dateutil) ou manipula-se ano e mês na mão; para dias, o timedelta resolve.
Como garantir que a contagem de dias seja sempre positiva?
Use a função abs sobre o número de dias: abs((data_a - data_b).days). abs devolve o valor sem sinal, então não importa qual data você coloca primeiro. É o jeito seguro de mostrar uma contagem regressiva sem surpresas negativas.
Dá para somar horas e minutos, não só dias?
Dá. O timedelta aceita várias unidades ao mesmo tempo, como timedelta(days=1, hours=6). Some isso a um datetime (que tem hora) para avançar dia e hora juntos. Somar horas a um date puro não faz sentido, porque date não guarda hora.
Por que dividir os dias por 365 dá idade aproximada e não exata?
Porque nem todo ano tem 365 dias: os anos bissextos têm 366. Ao dividir por 365 fixo, você ignora esses dias a mais, então o resultado pode errar por pouco em intervalos longos. Para o dia a dia, a aproximação serve; a idade exata pede comparar mês e dia.
O cálculo com today() se atualiza sozinho?
Sim. Como date.today() lê a data atual do computador toda vez que roda, um cálculo como hoje - nascimento devolve um número maior a cada dia que passa, sem você mexer no código. É por isso que today() é ideal para contagens que dependem do dia de hoje.

Fontes

Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.