Las fechas son las fuentes más comunes de bugs sutiles: zonas horarias, formatos ambiguos, meses que terminan en 28 o 31. El módulo datetime las maneja con objetos, no con strings.
Los tres objetos clave
from datetime import date, time, datetime
d = date(2026, 9, 4) # solo fecha
t = time(14, 30, 0) # solo hora
dt = datetime(2026, 9, 4, 14, 30) # fecha + hora
ahora = datetime.now() # el instante actual
hoy = date.today() # la fecha de hoy
Son objetos: se comparan, se restan y se formatean. Nunca guardes fechas como strings en tu lógica interna.
Formatear: strftime (objeto → string)
from datetime import datetime
dt = datetime(2026, 9, 4, 14, 30)
print(dt.strftime("%d/%m/%Y")) # 04/09/2026
print(dt.strftime("%Y-%m-%d")) # 2026-09-04 (formato ISO: el estándar)
print(dt.strftime("%d de %B, %H:%M")) # 04 de September, 14:30
Los códigos que usarás a diario:
| Código | Significado | Ejemplo |
|---|---|---|
%Y | año con 4 dígitos | 2026 |
%m | mes con 2 dígitos | 09 |
%d | día con 2 dígitos | 04 |
%H:%M:%S | hora:minuto:segundo | 14:30:05 |
%A | nombre del día | Friday |
Parsear: strptime (string → objeto)
La inversa — le dices qué formato tiene el texto:
from datetime import datetime
fecha = datetime.strptime("04/09/2026", "%d/%m/%Y")
print(fecha.year) # 2026
iso = datetime.fromisoformat("2026-09-04T14:30:00") # atajo para el formato ISO
¿strftime vs strptime? La f es format (a texto); la p es parse (desde texto).
timedelta: la aritmética de fechas
Un timedelta es una duración — la diferencia entre fechas o un intervalo que puedes sumar:
from datetime import date, timedelta
lanzamiento = date(2026, 9, 4)
hoy = date(2026, 8, 20)
diferencia = lanzamiento - hoy
print(diferencia) # 15 days, 0:00:00
print(diferencia.days) # 15
entrega = hoy + timedelta(days=7) # una semana después
print(entrega) # 2026-08-27
recordatorio = hoy + timedelta(weeks=2, days=1)
Restar dos fechas da timedelta; sumar fecha + timedelta da nueva fecha. Nunca calcules días "a mano" — los calendarios son traicioneros (¡bisiestos!).
Comparar fechas
from datetime import datetime
vence = datetime(2026, 9, 30)
hoy = datetime.now()
if hoy < vence:
print("A tiempo")
else:
print("Vencido hace", (hoy - vence).days, "días")
Zonas horarias: el aviso serio
datetime.now() da la hora local del servidor — ambigua. Para sistemas serios, guarda en UTC y convierte al mostrar:
from datetime import datetime, timezone
ahora_utc = datetime.now(timezone.utc) # consciente de zona horaria
Regla profesional: timestamps en UTC, conversión a zona local solo en la capa de presentación.
Resumen
date,time,datetime— objetos, nunca strings en la lógicastrftimeformatea a texto;strptimeparsea desde textotimedeltahace la aritmética: resta fechas, suma intervalos- Guarda timestamps en UTC; convierte al presentar
- El formato ISO (
%Y-%m-%d) es tu amigo: ordenable y sin ambigüedades