Carlos Seijas
← Volver a los blogs

Manejo de Fechas en Python: Guía completa con datetime

Código
PythonDatetimeFechasProgramaciónTiempoDesarrolloBackend
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

  1. Siempre usa UTC para guardar: Almacena fechas en UTC en tu base de datos, convierte a la zona local solo para mostrar
  2. Valida todo lo que venga del usuario: Las fechas que escriben los usuarios pueden ser cualquier cosa
  3. Usa try/except religiosamente: Las operaciones con fechas pueden fallar de mil maneras
  4. 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