🌗 ← Índice

🐍 Python P16 — Datas e Tempo (datetime)


Data: 14/08/2026

Nível: Intermediário (Mês 2 — POO)




🎯 Objetivos





📖 Teoria


Tipos principais



from datetime import datetime, date, time, timedelta

agora = datetime.now()          # 2026-08-14 15:30:45.123456
hoje = date.today()             # 2026-08-14
hora = time(15, 30, 45)         # 15:30:45

print(agora.year, agora.month, agora.day)
print(agora.hour, agora.minute, agora.second)

Criar datas específicas



nascimento = datetime(1995, 3, 10, 14, 30)
print(nascimento)               # 1995-03-10 14:30:00

`timedelta` — aritmética de tempo



from datetime import datetime, timedelta

hoje = datetime.now()
daqui_7_dias = hoje + timedelta(days=7)
ontem = hoje - timedelta(days=1)
daqui_2h30 = hoje + timedelta(hours=2, minutes=30)

print(daqui_7_dias)

Diferença entre datas



inicio = datetime(2026, 1, 1)
fim = datetime(2026, 12, 31)
diferenca = fim - inicio
print(diferenca.days)           # 364
print(diferenca.total_seconds()) # em segundos

Formatação — `strftime` (date → string)



agora = datetime.now()
print(agora.strftime("%d/%m/%Y"))          # 14/08/2026
print(agora.strftime("%d de %B de %Y"))    # 14 de August de 2026
print(agora.strftime("%H:%M:%S"))          # 15:30:45
print(agora.strftime("%A"))                # Friday

CódigoSignificadoExemplo
`%d`dia14
`%m`mês08
`%Y`ano (4 díg.)2026
`%H`hora (24h)15
`%M`minuto30
`%S`segundo45
`%B`mês por extensoAugust
`%A`dia da semanaFriday

Parsing — `strptime` (string → date)



texto = "14/08/2026 15:30"
data = datetime.strptime(texto, "%d/%m/%Y %H:%M")
print(data)                     # 2026-08-14 15:30:00

⚠️ O formato precisa bater EXATAMENTE com a string, senão levanta `ValueError`.

Fusos horários



from datetime import datetime, timezone, timedelta

utc_agora = datetime.now(timezone.utc)     # hora em UTC
print(utc_agora)

# Offset fixo (UTC-3 — Brasil)
brasilia = timezone(timedelta(hours=-3))
print(utc_agora.astimezone(brasilia))

`zoneinfo` — fusos nomeados (Python 3.9+)



from datetime import datetime
from zoneinfo import ZoneInfo

agora = datetime.now(ZoneInfo("America/Sao_Paulo"))
print(agora)                    # horário de Brasília

nova_york = agora.astimezone(ZoneInfo("America/New_York"))
print(nova_york)

💡 `zoneinfo` usa a base de dados IANA do sistema — sem dependência externa.

Comparação e ordenação



d1 = datetime(2026, 8, 10)
d2 = datetime(2026, 8, 14)
print(d1 < d2)                  # True
print(d2 - d1)                  # 4 days, 0:00:00



✍️ Exercícios


  1. 1. Imprima a data de hoje no formato `"quinta-feira, 14 de agosto de 2026"` (use `strftime` com `%A`, `%d`, `%B`, `%Y`).
  2. 2. Calcule quantos dias faltam para o Natal (25/12) a partir de hoje.
  3. 3. Converta a string `"2026-08-14 15:30:00"` em `datetime` e imprima o ano, mês e dia separadamente.
  4. 4. Mostre a hora atual em Tóquio (`Asia/Tokyo`) usando `zoneinfo`.



🧪 Desafio


Crie uma função dias_uteis(inicio, fim) que retorna a quantidade de dias úteis (segunda a sexta) entre duas datas:



def dias_uteis(inicio: datetime, fim: datetime) -> int:
    ...

Teste: dias_uteis(datetime(2026, 8, 1), datetime(2026, 8, 31)) → deve retornar 21 (agosto de 2026 tem 21 dias úteis).


Dica: itere dia a dia com timedelta(days=1) e use date.weekday() (0=segunda, 6=domingo).




✅ Correção



from datetime import datetime, timedelta


def dias_uteis(inicio: datetime, fim: datetime) -> int:
    total = 0
    atual = inicio
    while atual <= fim:
        if atual.weekday() < 5:        # 0-4 = seg-sex
            total += 1
        atual += timedelta(days=1)
    return total


print(dias_uteis(datetime(2026, 8, 1), datetime(2026, 8, 31)))  # 21

💡 Dica extra: para intervalos gigantes, dá pra calcular sem loop com fórmula, mas o loop com timedelta é claro e suficiente até ~milhões de dias.





HB Estudos · ← Voltar ao índice de Python