Datas e Horários
Lidar com datas e horas é uma das tarefas mais comuns na programação — registrar timestamps de log, calcular dias de empréstimo, agregar dados ao longo de períodos de tempo... O módulo
datetimeé a forma padrão do Python de trabalhar com datas e horas.
1. Obtendo a Hora Atual
from datetime import datetime, date, time
# Data e hora atuais
now = datetime.now()
print(now) # 2026-06-23 16:00:00.123456
# Data atual
today = date.today()
print(today) # 2026-06-23
# Criar uma data específica
d = datetime(2026, 6, 23, 15, 30, 0)
print(d) # 2026-06-23 15:30:00
Exemplo: Lembrete de Aniversário (Dificuldade ⭐)
from datetime import datetime
def dias_para_aniversario(data_nasc):
"""Calcula dias até o próximo aniversário"""
today = datetime.now()
birth = datetime.strptime(data_nasc, "%d-%m")
aniversario_este_ano = birth.replace(year=today.year)
if aniversario_este_ano < today:
aniversario_este_ano = aniversario_este_ano.replace(year=today.year + 1)
delta = aniversario_este_ano - today
return delta.days
print(f"Dias até o próximo aniversário: {dias_para_aniversario('25-12')}")
2. Formatação e Análise
from datetime import datetime
# Data -> string (formatação)
now = datetime.now()
print(now.strftime("%Y-%m-%d")) # 2026-06-23
print(now.strftime("%H:%M:%S")) # 16:00:00
print(now.strftime("%A")) # Tuesday
# String -> data (análise)
date_str = "2026-06-23 15:30:00"
parsed = datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S")
print(parsed) # 2026-06-23 15:30:00
| Código de Formato | Significado | Exemplo |
|---|---|---|
%Y |
Ano com 4 dígitos | 2026 |
%m |
Mês com 2 dígitos | 06 |
%d |
Dia com 2 dígitos | 23 |
%H |
Hora (formato 24h) | 15 |
%M |
Minuto | 30 |
%S |
Segundo | 00 |
%A |
Nome completo do dia da semana | Tuesday |
strftime é "data -> string", strptime é "string -> data". Lembre-se: "f" = format (saída), "p" = parse (entrada).
3. timedelta: Diferenças de Tempo
from datetime import datetime, timedelta
now = datetime.now()
# Calcular tempos futuros/passados
future = now + timedelta(days=7)
past = now - timedelta(days=30)
print(f"Em 7 dias: {future.strftime('%Y-%m-%d')}")
print(f"30 dias atrás: {past.strftime('%Y-%m-%d')}")
# Cálculo de tempo
print(timedelta(days=7)) # 7 days, 0:00:00
print(timedelta(hours=3, minutes=15)) # 3:15:00
print(timedelta(weeks=2)) # 14 days, 0:00:00
# Subtrair duas datas
d1 = datetime(2026, 6, 1)
d2 = datetime(2026, 6, 23)
diff = d2 - d1
print(f"Diferença: {diff.days} dias") # Diferença: 22 dias
Exemplo: Lembrete de Expiração de Assinatura (Dificuldade ⭐⭐)
from datetime import datetime, timedelta
# Simula informações de assinatura de usuário
subscriptions = [
{"name": "João Silva", "expire": "2026-07-15"},
{"name": "Maria Souza", "expire": "2026-06-25"},
{"name": "Pedro Santos", "expire": "2026-08-01"},
{"name": "Ana Oliveira", "expire": "2026-06-20"},
]
today = datetime.now().strftime("%Y-%m-%d")
today = datetime.strptime(today, "%Y-%m-%d")
print("=== Verificação de Expiração de Assinatura ===")
for sub in subscriptions:
expire = datetime.strptime(sub["expire"], "%Y-%m-%d")
remaining = (expire - today).days
if remaining < 0:
print(f"Expirado ({sub['name']}): {-remaining} dias atrás")
elif remaining <= 7:
print(f"Expirando em breve ({sub['name']}): {remaining} dias restantes")
else:
print(f"Ativo ({sub['name']}): {remaining} dias restantes")
Casos de Uso Comuns
- Timestamps de log: Registre a hora atual para cada entrada de log.
- Verificação de expiração: Determine se uma associação/assinatura expirou.
- Cálculo de data: Calcule o número de dias entre duas datas.
- Formatação de tempo: Exiba horas em formatos amigáveis ao usuário.
- Tarefas agendadas: Execute uma operação em um horário especificado.
❓ Perguntas Frequentes
P:
datetime.now()retorna hora local ou UTC? R: Hora local. Usedatetime.utcnow()para UTC. Note queutcnow()retorna um datetime naive sem informação de fuso horário. Para produção, usedatetime.now(timezone.utc)oupytz/zoneinfopara manipulação adequada de fuso horário. P: O que acontece se a análisestrptimefalhar? R: LevantaValueError— "time data 'xxx' does not match format '%Y-%m-%d'". Coloque em try-except para lidar com erros. Armadilha comum: meses e dias devem ter dois dígitos (%mnão corresponde a"6", precisa de"06"). P: Qual o máximo de dias suportado portimedelta? R: Teoricamente sem limite superior —timedelta(days=1000000)é válido. No entanto,total_seconds()pode transbordar. Para uso diário, o intervalo não é uma preocupação.
📖 Resumo
datetime.now()obtém data/hora atual;date.today()obtém apenas a datastrftime()data -> string;strptime()string -> data- Formatos comuns:
%Yano,%mmês,%ddia,%Hhora,%Mminuto,%Ssegundo timedeltapara aritmética de datas:days,hours,minutes,weeks- Subtrair dois objetos
datetimedá umtimedelta; a propriedade.daysobtém a diferença em dias
📝 Atividades
-
Iniciante (Dificuldade ⭐): Exiba a hora atual nestes formatos:
2026-06-23 Tuesday,2026-06-23 16:00,06/23/2026. -
Intermediário (Dificuldade ⭐⭐): Escreva uma função
dias_uteis_entre(inicio, fim)que calcula quantos dias úteis (segunda a sexta) existem entre duas datas. Dica: Usetimedeltapara iterar cada dia; useweekday()para verificar o dia da semana (0=segunda, 4=sexta). -
Avançado (Dificuldade ⭐⭐⭐): Escreva um "Temporizador Pomodoro." Trabalhe 25 minutos -> descanse 5 minutos, repita 4 vezes, depois faça uma pausa longa de 15 minutos. Use
time.sleep()para temporização edatetimepara exibir a fase atual e o tempo restante.



