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

PYTHON
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 ⭐)

PYTHON
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')}")
▶ Experimente

2. Formatação e Análise

PYTHON
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

PYTHON
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 ⭐⭐)

PYTHON
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")
▶ Experimente

Casos de Uso Comuns


❓ Perguntas Frequentes

P: datetime.now() retorna hora local ou UTC? R: Hora local. Use datetime.utcnow() para UTC. Note que utcnow() retorna um datetime naive sem informação de fuso horário. Para produção, use datetime.now(timezone.utc) ou pytz/zoneinfo para manipulação adequada de fuso horário. P: O que acontece se a análise strptime falhar? R: Levanta ValueError — "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 (%m não corresponde a "6", precisa de "06"). P: Qual o máximo de dias suportado por timedelta? 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


📝 Atividades

  1. Iniciante (Dificuldade ⭐): Exiba a hora atual nestes formatos: 2026-06-23 Tuesday, 2026-06-23 16:00, 06/23/2026.

  2. 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: Use timedelta para iterar cada dia; use weekday() para verificar o dia da semana (0=segunda, 4=sexta).

  3. 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 e datetime para exibir a fase atual e o tempo restante.

100%