Armadilhas do datetime em Python, e o que as bibliotecas estão (ou não estão) fazendo a respeito

Lidar com datas e horas em software acaba sendo muito mais complexo do que “basta usar UTC”, especialmente quando entram horário de verão, leis de fuso horário que mudam e eventos futuros voltados para humanos, como reuniões ou contratos. Comentadores debatem como o módulo `datetime` do Python e alternativas deveriam representar o tempo — instantes UTC, horários locais do “relógio de parede”, offsets fixos ou fusos IANA completos — e se bibliotecas deveriam permitir tempos ambíguos ou inexistentes. Muitos concluem que nenhum modelo único serve para todos os casos de uso, então bibliotecas robustas precisam de vários tipos explícitos e trade-offs claros, em vez de uma abstração mágica única de timestamp.

UTC vs horário local e datetimes futuros

  • Muitos argumentam que “armazenar tudo em UTC” funciona bem para eventos passados e timestamps centrados na máquina.
  • Outros enfatizam que isso falha para horários futuros agendados por humanos (reuniões, compromissos, contratos).
  • Ponto-chave: horários futuros no relógio local geralmente devem ser armazenados como (datetime local + fuso horário IANA), e não pré-convertidos para UTC, porque as regras de fuso horário/DST podem mudar.
  • Não existe uma regra universal: às vezes os usuários querem um instante UTC fixo, às vezes “hora local” em um lugar.

DST, fusos horários e expectativas humanas

  • DST e políticas de fuso horário são políticas e mutáveis; não é possível prever regras futuras.
  • Eventos recorrentes (“toda segunda às 10:00”, “1:1 a cada duas semanas às 13h”) não devem mudar uma hora ao atravessar o DST; isso exige modelar explicitamente o horário local e os fusos.
  • Reuniões entre continentes sofrem desalinhamento temporário quando as transições de DST ocorrem em datas diferentes; calendários normalmente escolhem um fuso de referência.

Formatos de dados e épocas (ISO 8601, Unix time etc.)

  • ISO 8601 / RFC 3339 ajudam com formatação de strings, mas não resolvem semântica de fuso horário/DST nem localização.
  • Formatos no estilo americano MM/DD/YYYY e ferramentas como o Excel são vistos como grandes fontes de bugs.
  • Segundos desde a época Unix (ou micros/nanosegundos inteiros) são populares para representação interna, mas o suporte a datas anteriores a 1970 e segundos bissextos é complicado.

Segundos bissextos

  • Algumas bibliotecas (por exemplo, de uso geral, incluindo as discutidas) ignoram segundos bissextos; outras especializadas (por exemplo, focadas em astronomia) lidam com eles.
  • As opiniões divergem: alguns consideram aceitável ignorar segundos bissextos para a maioria dos aplicativos; outros observam que isso quebra cálculos precisos de duração/instante e o parsing de “23:59:60”.

Design de bibliotecas: tipos e comportamento

  • Forte समर्थन para tipos distintos:
    • Instant/UTC-only,
    • ZonedDateTime (fusos IANA),
    • OffsetDateTime (offset fixo),
    • date-times locais/naive para casos de uso de relógio local ou recorrência.
  • Combinar dados naive e com fuso em um único tipo (como em algumas bibliotecas de JS e Python) é amplamente criticado.
  • Debate sobre representar horários inexistentes durante lacunas de DST:
    • Alguns preferem proibir ou gerar erro para horários locais inválidos.
    • Outros preferem mapeamentos “best-effort” documentados e determinísticos, mesmo que surpreendentes.

Conceito de “horário local”

  • Alguns argumentam que o “horário local” do sistema é um erro histórico, exceto para UI e compatibilidade com libc; melhor seria sempre especificar fusos horários ou localidades explicitamente.
  • Outros observam que usuários e dispositivos comuns ainda precisam de uma noção de hora local do relógio para alarmes, tarefas estilo cron e semânticas como “às 16h no café”.