PythonAprende PythonDocumentación

Fechas y horas

datetime, timedelta y el formateo con strftime.

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ódigoSignificadoEjemplo
%Yaño con 4 dígitos2026
%mmes con 2 dígitos09
%ddía con 2 dígitos04
%H:%M:%Shora:minuto:segundo14:30:05
%Anombre del díaFriday

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ógica
  • strftime formatea a texto; strptime parsea desde texto
  • timedelta hace 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

Quiz

  1. 1. ¿Qué devuelve datetime.date.today()?

  2. 2. ¿Qué hace strftime?

  3. 3. ¿Qué representa un timedelta?

Ejercicios

Ejercicio 1: Formatear una fecha

Importa datetime y imprime datetime.date(2026, 9, 4) formateado con strftime como %d/%m/%Y. Resultado: 04/09/2026

Cargando editor…

Ejercicio 2: Días entre fechas

Completa `dias_entre(inicio, fin)`: recibe dos fechas como strings "YYYY-MM-DD", las convierte con strptime y devuelve la diferencia en días (fin - inicio).

Cargando editor…