Menu

datetime em Python: datas, horas, timedeltas e fusos horários

Um passeio prático pelo módulo datetime do Python — parsear, formatar, fazer matemática com datas e lidar com fusos horários sem se perder.

Os dois tipos centrais: date e datetime

O módulo datetime te dá quatro coisas que vale conhecer: date, time, datetime e timedelta. Os três primeiros são o que parecem; o quarto é um intervalo de tempo.

main.py
Output
Click Run to see the output here.

Um date representa um dia — ano, mês, dia — sem relógio. Um datetime é uma data mais uma hora. Se você não precisa do relógio, date é a escolha mais organizada.

Criando datas específicas

Construa diretamente:

main.py
Output
Click Run to see the output here.

Argumentos são year, month, day para date, e até year, month, day, hour, minute, second, microsecond para datetime.

Lendo campos

Todo date/datetime tem atributos:

main.py
Output
Click Run to see the output here.

isoformat() é seu amigo para saída legível por máquina — produz algo como "2026-04-20T09:30:15" que outros sistemas conseguem parsear sem ambiguidade.

Formatando com strftime

Para saída legível por humanos, .strftime(fmt) transforma um date ou datetime numa string formatada:

main.py
Output
Click Run to see the output here.

Os códigos de formato que mais vale lembrar:

  • %Y — ano com 4 dígitos (2026)
  • %m — número do mês, com zero à esquerda (04)
  • %d — dia do mês, com zero à esquerda (20)
  • %H / %I — hora, formato 24/12 horas
  • %M — minuto
  • %S — segundo
  • %A / %a — nome do dia da semana completo / abreviado (Monday / Mon)
  • %B / %b — nome do mês completo / abreviado (April / Apr)
  • %p — AM/PM

Você não precisa decorar; marque uma referência e consulte quando precisar.

Parseando com strptime

A direção inversa: pegue uma string com um formato conhecido e transforme num datetime:

main.py
Output
Click Run to see the output here.

A string de formato precisa bater com a entrada exatamente. Se não bate, strptime lança ValueError.

Para strings ISO-8601 (o padrão legível por máquina), tem um atalho mais simples no Python moderno:

main.py
Output
Click Run to see the output here.

Se você está lidando com formatos variados, o pacote externo dateutil (pip install python-dateutil) tem um parser.parse() permissivo que chuta de forma razoável.

Aritmética com timedelta

Para fazer matemática com datas, use timedelta para a diferença ou deslocamento:

main.py
Output
Click Run to see the output here.

Argumentos do timedelta: days, seconds, microseconds, milliseconds, minutes, hours, weeks. Sem months ou years — meses têm tamanho variável. Para matemática de mês/ano, use dateutil.relativedelta:

from dateutil.relativedelta import relativedelta
from datetime import date

today = date.today()
next_quarter = today + relativedelta(months=3)
print(next_quarter)

Fusos horários: naive vs aware

Um datetime sem info de fuso horário é naive — o Python não sabe qual fuso representa. Matemática de tempo em datetimes naive está bem contanto que você fique dentro de um fuso lógico; o problema começa no momento em que dados de fusos diferentes se encontram.

Um datetime aware carrega info de fuso com ele. Anexe um fuso explicitamente:

main.py
Output
Click Run to see the output here.

O Python 3.9 adicionou o módulo zoneinfo para fusos nomeados (usando o banco IANA do sistema):

main.py
Output
Click Run to see the output here.

Converta entre fusos com .astimezone():

main.py
Output
Click Run to see the output here.

Uma regra que vale gravar: guarde datetimes em UTC, converta para fusos locais só na hora de exibir. Esse hábito só previne a maioria dos bugs de fuso horário.

Timestamps

Um timestamp Unix é o número de segundos desde 1970-01-01 UTC. O Python converte fácil:

main.py
Output
Click Run to see the output here.

Timestamps são úteis para comparações, ordenação e interoperação com outros sistemas. Para saída voltada a humanos, converta de volta para datetime primeiro.

Medindo quanto algo demora

Para cronometragens rápidas, subtraia dois datetimes:

main.py
Output
Click Run to see the output here.

Para medição de performance mais séria, use time.perf_counter() — tem resolução sub-microssegundo e é imune a mudanças de relógio do sistema. datetime.now() serve para números estilo "quanto demorou essa chamada de API".

Padrões que você vai reusar

main.py
Output
Click Run to see the output here.

O que levar

  • date, datetime e timedelta cobrem 90% das necessidades.
  • Use ISO-8601 para legível por máquina; strftime para legível por humanos.
  • Guarde em UTC; converta na hora de exibir.
  • Use zoneinfo para fusos nomeados.
  • Para meses e anos, recorra a dateutil.relativedelta.

Mais uma ferramenta para seu kit do mundo real: expressões regulares, a seguir.

Perguntas frequentes

Como pego a data e hora atuais em Python?

datetime.now() retorna a data e hora local atuais. datetime.utcnow() retorna UTC (embora a preferência moderna seja datetime.now(timezone.utc), já que utcnow() retorna um datetime naive). Para só a data, use date.today().

Como formato uma data como string?

Use .strftime(format) com códigos de formato como %Y-%m-%d para ano-mês-dia. Exemplo: datetime.now().strftime('%Y-%m-%d %H:%M'). Para parsear uma string de volta, use datetime.strptime(text, format) com os mesmos códigos.

Como adiciono dias a uma data em Python?

Use timedelta: from datetime import date, timedelta; date.today() + timedelta(days=7). timedelta suporta dias, horas, minutos, segundos, semanas e mais. Para matemática com mês e ano, use o externo dateutil.relativedeltatimedelta não conhece meses.

Aprenda a programar com o Coddy

COMEÇAR