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.
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:
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:
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:
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:
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:
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:
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:
O Python 3.9 adicionou o módulo zoneinfo para fusos nomeados (usando o banco IANA do sistema):
Converta entre fusos com .astimezone():
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:
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:
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
O que levar
date,datetimeetimedeltacobrem 90% das necessidades.- Use ISO-8601 para legível por máquina;
strftimepara legível por humanos. - Guarde em UTC; converta na hora de exibir.
- Use
zoneinfopara 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.relativedelta — timedelta não conhece meses.