Manejo de Fechas en Python: Guía completa con datetime
¿Te ha pasado que una app muestra que tu vuelo sale "ayer" cuando debería ser "mañana"? ¿O que un sistema de facturación te cobre por servicios del futuro? Créeme, el 90% de los errores más caros en aplicaciones empresariales tienen que ver con el manejo de fechas mal hecho.
Al terminar de leer esto, vas a dominar todas las herramientas que Python te da para no cometer esos errores que pueden costarte miles de dólares (o al menos muchos dolores de cabeza).
El mundo complicado de las fechas (y por qué Python lo hace fácil)
El manejo de fechas en Python es una de esas cosas que todo desarrollador tiene que aprender sí o sí. Desde logs que registran cuándo pasó algo, hasta sistemas de facturación que cobran por mes, las fechas están metidas en casi todo lo que programamos.
Python viene con varios módulos para trabajar con fechas, pero datetime es el rey indiscutible. Te permite crear, manipular y formatear fechas sin volverte loco.
Lo importante es que el manejo de fechas puede ser un verdadero infierno por culpa de zonas horarias, años bisiestos, formatos que cambian según el país... Por suerte, Python te ahorra la mayoría de esos quebraderos de cabeza.
Datetime: tu nueva herramienta favorita
El módulo datetime es como la navaja suiza para fechas en Python. Tiene clases para trabajar con fechas, horas, y todo lo que se te ocurra relacionado con el tiempo.
Empezando con lo básico
from datetime import datetime, date, time, timedelta
# Fecha de ahora mismo
fecha_actual = datetime.now()
print(fecha_actual) # 2024-01-27 15:30:45.123456
# Una fecha específica que tú eliges
fecha_especifica = datetime(2024, 12, 25, 10, 30, 0)
print(fecha_especifica) # 2024-12-25 10:30:00
La familia datetime (y sus personalidades)
datetime: El todoterreno que combina fecha y hora date: El minimalista que solo se encarga de la fecha (año, mes, día) time: El especialista que solo maneja horas, minutos, segundos timedelta: El matemático que calcula diferencias de tiempo
Crear y manipular fechas como un pro
Mil formas de crear una fecha
# La fecha de hoy y este momento exacto
hoy = date.today()
ahora = datetime.now()
# Una fecha que tú decides
mi_fecha = date(2024, 3, 15)
mi_datetime = datetime(2024, 3, 15, 14, 30, 0)
# Convertir un string a fecha (súper útil)
fecha_string = datetime.strptime("2024-03-15", "%Y-%m-%d")
Desmenuzar una fecha (como cortar una cebolla, pero sin llorar)
fecha = datetime(2024, 3, 15, 14, 30, 45)
print(fecha.year) # 2024 - el año
print(fecha.month) # 3 - el mes
print(fecha.day) # 15 - el día
print(fecha.hour) # 14 - la hora (formato 24h)
print(fecha.minute) # 30 - los minutos
print(fecha.second) # 45 - los segundos
Formateo de fechas: hacer que se vean bonitas
En mi experiencia, una de las cosas que más vas a hacer es mostrar fechas en diferentes formatos. El método strftime() es tu amigo para esto.
Los códigos que más vas a usar
fecha = datetime(2024, 3, 15, 14, 30, 45)
# Los clásicos
print(fecha.strftime("%Y-%m-%d")) # 2024-03-15
print(fecha.strftime("%d/%m/%Y")) # 15/03/2024
print(fecha.strftime("%Y-%m-%d %H:%M")) # 2024-03-15 14:30
# Para que se vea más fancy
print(fecha.strftime("%B %d, %Y")) # March 15, 2024
print(fecha.strftime("%A, %d de %B")) # Friday, 15 de March
Formatos para diferentes situaciones
# Para logs (clásico y efectivo)
log_format = fecha.strftime("%Y-%m-%d %H:%M:%S")
# Para nombres de archivos (sin espacios ni caracteres raros)
file_format = fecha.strftime("%Y%m%d_%H%M%S")
# Para mostrar al usuario (que se entienda fácil)
readable_format = fecha.strftime("%d de %B del %Y")
Parsing: convertir texto en fechas reales
Ojo, esto es súper importante. El método strptime() convierte strings a objetos datetime usando patrones específicos.
# Diferentes formatos que te pueden llegar
fecha1 = datetime.strptime("2024-03-15", "%Y-%m-%d")
fecha2 = datetime.strptime("15/03/2024 14:30", "%d/%m/%Y %H:%M")
fecha3 = datetime.strptime("March 15, 2024", "%B %d, %Y")
# Siempre maneja errores (porque los usuarios son impredecibles)
try:
fecha = datetime.strptime("fecha inválida", "%Y-%m-%d")
except ValueError as e:
print(f"Error al parsear fecha: {e}")
Matemáticas con fechas (más fácil de lo que suena)
La clase timedelta es genial para hacer cálculos con fechas. Sumar días, restar horas, calcular diferencias... todo eso.
Operaciones que usas todo el tiempo
from datetime import timedelta
fecha_base = datetime(2024, 3, 15)
# Sumando tiempo como si fuera dinero
una_semana_despues = fecha_base + timedelta(days=7)
un_mes_despues = fecha_base + timedelta(days=30)
dos_horas_despues = fecha_base + timedelta(hours=2)
# Restando (para ir al pasado)
una_semana_antes = fecha_base - timedelta(days=7)
Calcular cuánto tiempo pasó
fecha1 = datetime(2024, 3, 15, 10, 0, 0)
fecha2 = datetime(2024, 3, 20, 15, 30, 0)
diferencia = fecha2 - fecha1
print(diferencia.days) # 5 días
print(diferencia.seconds) # 19800 segundos
print(diferencia.total_seconds()) # 454800.0 segundos en total
Zonas horarias: el dolor de cabeza universal
El manejo de fechas en apps globales significa lidiar con zonas horarias. Es complicado, pero Python te ayuda.
Con pytz (tu salvador para zonas horarias)
import pytz
# UTC: el punto de referencia universal
utc = pytz.UTC
fecha_utc = datetime.now(utc)
# Zonas específicas
madrid = pytz.timezone('Europe/Madrid')
fecha_madrid = datetime.now(madrid)
# Convertir entre zonas (magia pura)
fecha_convertida = fecha_utc.astimezone(madrid)
Casos prácticos que te van a servir
Validar si una fecha tiene sentido
def es_fecha_valida(fecha_str, formato="%Y-%m-%d"):
try:
datetime.strptime(fecha_str, formato)
return True
except ValueError:
return False
def esta_en_rango(fecha, inicio, fin):
return inicio <= fecha <= fin
Calcular la edad de alguien (correctamente)
def calcular_edad(fecha_nacimiento):
hoy = date.today()
edad = hoy.year - fecha_nacimiento.year
# Si aún no cumplió años este año, restamos uno
if (hoy.month, hoy.day) < (fecha_nacimiento.month, fecha_nacimiento.day):
edad -= 1
return edad
Consejos que me hubiera gustado saber antes
- Siempre usa UTC para guardar: Almacena fechas en UTC en tu base de datos, convierte a la zona local solo para mostrar
- Valida todo lo que venga del usuario: Las fechas que escriben los usuarios pueden ser cualquier cosa
- Usa try/except religiosamente: Las operaciones con fechas pueden fallar de mil maneras
- No ignores las zonas horarias: Si tu app la van a usar desde diferentes países, esto es crítico
Lo que realmente importa
El manejo de fechas en Python es una de esas habilidades que todo desarrollador tiene que dominar. Con las herramientas que te mostré acá, puedes crear aplicaciones que manejen fechas correctamente sin romperse.
Créeme, dominar esto te va a ahorrar muchísimos problemas. La próxima vez que tengas que trabajar con fechas, ya sabes que Python te tiene cubierto con datetime y sus amigos.
Y recuerda: una fecha mal manejada puede arruinar todo un sistema, pero una fecha bien manejada pasa desapercibida. Esa es la belleza del código que funciona bien.
Comentarios
Posts relacionados
¿Qué son los Triggers en PostgreSQL? Guía práctica
Aprende todo sobre los triggers en PostgreSQL: qué son, cómo funcionan y cómo implementarlos. Guía completa con ejemplos prácticos y comparaciones con MySQL.
¿Qué son las Expresiones Regulares? Guía completa
Domina las expresiones regulares (regex) desde cero. Aprende su sintaxis, patrones comunes y casos de uso prácticos con ejemplos detallados.
¿Qué es TypeScript? Guía completa del superset de JavaScript
Aprende TypeScript, el superset tipado de JavaScript que mejora tu código. Descubre sus características, ventajas y cómo empezar a usarlo.
Programación Recursiva: Guía completa con ejemplos prácticos
Domina la programación recursiva desde cero. Aprende qué es la recursión, cómo funciona y cuándo usarla con ejemplos en JavaScript y Python.