Menu

datetime en Python: fechas, horas, timedeltas y zonas horarias

Un recorrido práctico por el módulo datetime de Python — parsear, formatear, hacer matemáticas sobre fechas y manejar zonas horarias sin perderse.

Los dos tipos principales: date y datetime

El módulo datetime te da cuatro cosas que vale la pena conocer: date, time, datetime y timedelta. Los tres primeros son lo que suenan; el cuarto es un lapso de tiempo.

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

Un date representa un día — año, mes, día — sin reloj. Un datetime es una fecha más una hora. Si no necesitas el reloj, date es la elección más ordenada.

Crear fechas específicas

Construye directamente:

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

Los argumentos son year, month, day para date, y hasta year, month, day, hour, minute, second, microsecond para datetime.

Leer campos

Cada date/datetime tiene atributos:

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

isoformat() es tu amigo para salida legible por máquinas — produce algo como "2026-04-20T09:30:15" que otros sistemas pueden parsear sin ambigüedad.

Formatear con strftime

Para salida legible por humanos, .strftime(fmt) convierte una date o datetime en un string formateado:

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

Los códigos de formato que más vale la pena recordar:

  • %Y — año de 4 dígitos (2026)
  • %m — número de mes, rellenado con cero (04)
  • %d — día del mes, rellenado con cero (20)
  • %H / %I — hora, formato 24/12 horas
  • %M — minuto
  • %S — segundo
  • %A / %a — nombre del día entero / abreviado (Monday / Mon)
  • %B / %b — nombre del mes entero / abreviado (April / Apr)
  • %p — AM/PM

No necesitas memorizarlos; marca una referencia y búscalos cuando necesites uno.

Parsear con strptime

La dirección inversa: coge un string con una forma conocida y conviértelo en un datetime:

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

El string de formato debe coincidir con la entrada exactamente. Si no, strptime lanza ValueError.

Para strings ISO-8601 (el estándar legible por máquina), hay un atajo más simple en Python moderno:

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

Si tratas con formatos aleatorios, el paquete externo dateutil (pip install python-dateutil) tiene un parser.parse() indulgente que hace una suposición razonable.

Aritmética con timedelta

Para hacer matemáticas sobre fechas, usa timedelta para la diferencia u offset:

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

Argumentos de timedelta: days, seconds, microseconds, milliseconds, minutes, hours, weeks. Nada de months ni years — los meses son de longitud variable. Para matemáticas de mes/año, usa dateutil.relativedelta:

from dateutil.relativedelta import relativedelta
from datetime import date

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

Zonas horarias: naive vs aware

Un datetime sin información de zona horaria es naive — Python no sabe qué zona horaria representa. Las matemáticas sobre datetimes naive están bien mientras te quedes dentro de una zona horaria lógica; los problemas empiezan en el momento en que datos de distintas zonas se juntan.

Un datetime aware lleva información de zona consigo. Adjunta una zona horaria explícitamente:

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

Python 3.9 añadió el módulo zoneinfo para zonas horarias con nombre (usando la base de datos IANA del sistema):

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

Convierte entre zonas con .astimezone():

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

Una regla que vale la pena comprometer a memoria: guarda los datetimes en UTC, convierte a zonas locales solo en el momento de mostrar. Ese único hábito previene la mayoría de bugs de zona horaria.

Timestamps

Un timestamp Unix es el número de segundos desde el 1970-01-01 UTC. Python convierte fácilmente:

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

Los timestamps son útiles para comparaciones, ordenación e interoperabilidad con otros sistemas. Para salida orientada a humanos, convierte de vuelta a un datetime primero.

Medir cuánto tarda algo

Para cronometrajes rápidos, resta dos datetimes:

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

Para medición de rendimiento más seria, usa time.perf_counter() — tiene resolución sub-microsegundo y es inmune a cambios del reloj del sistema. datetime.now() está bien para números del estilo "¿cuánto tardó esta llamada a API?".

Patrones que reutilizarás

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

Qué te llevas

  • date, datetime y timedelta cubren el 90% de necesidades.
  • Usa ISO-8601 para legible por máquina; strftime para legible por humanos.
  • Guarda en UTC; convierte al mostrar.
  • Usa zoneinfo para zonas horarias con nombre.
  • Para meses y años, recurre a dateutil.relativedelta.

Una herramienta más para tu kit del mundo real: las expresiones regulares, a continuación.

Preguntas frecuentes

¿Cómo obtengo la fecha y hora actuales en Python?

datetime.now() devuelve la fecha y hora local actual. datetime.utcnow() devuelve UTC (aunque la preferencia moderna es datetime.now(timezone.utc) ya que utcnow() devuelve un datetime naive). Para solo la fecha, usa date.today().

¿Cómo formateo una fecha como string?

Usa .strftime(format) con códigos de formato como %Y-%m-%d para año-mes-día. Ejemplo: datetime.now().strftime('%Y-%m-%d %H:%M'). Para parsear un string de vuelta, usa datetime.strptime(text, format) con los mismos códigos de formato.

¿Cómo añado días a una fecha en Python?

Usa timedelta: from datetime import date, timedelta; date.today() + timedelta(days=7). timedelta soporta days, hours, minutes, seconds, weeks y más. Para matemática de meses y años, usa el dateutil.relativedelta externo — timedelta no conoce los meses.

Aprende a programar con Coddy

COMENZAR