¡Domina las Fechas y Horas en Python con el Módulo datetime!
Para ejecutar Python desde el símbolo del sistema o PowerShell en tu PC, necesitas descargar e instalar Python.
Si aún no lo has hecho, consulta el artículo Instalación de Python y configuración del entorno de desarrollo para instalar Python.
Cuando desarrollas sitios web o aplicaciones, a menudo te encuentras con situaciones en las que necesitas manejar fechas y horas, como "mostrar la hora actual", "registrar la fecha de publicación de un artículo" o "calcular el tiempo restante para una oferta". Es en esos momentos cuando el módulo datetime, que viene integrado en Python, se convierte en tu mejor aliado.
En este artículo, explicaremos desde el uso básico del módulo datetime hasta algunas técnicas un poco más avanzadas, con ejemplos de código que incluso los principiantes pueden copiar y pegar para experimentar cómo "simplemente funciona". ¡Vamos a sumergirnos en el mundo de las fechas y las horas! 🚀
Lo Básico del Módulo datetime
Para empezar, veamos cómo preparar el módulo datetime y su función más fundamental: "obtener la fecha y hora actuales".
Importar el Módulo
Para usar el módulo datetime, primero debes importarlo (cargarlo) al principio de tu código. Sin esto, Python te preguntará: "¿Qué es datetime?".
import datetime
Obtener la Fecha y Hora Actual
Obtener la fecha y la hora de este preciso instante es muy fácil. Solo tienes que llamar a `datetime.datetime.now()`.
import datetime
# Obtener la fecha y hora actual
now = datetime.datetime.now()
print(now)
# Ejemplo de salida: 2025-07-11 07:42:15.123456
Si no necesitas la hora y solo quieres la fecha de hoy, usa `datetime.date.today()`.
import datetime
# Obtener solo la fecha de hoy
today = datetime.date.today()
print(today)
# Ejemplo de salida: 2025-07-11
Acceder a los Elementos Individuales de Fecha y Hora
Del objeto `datetime` que has obtenido, puedes extraer información individual como el año, mes, día, hora, minuto y segundo. Esto es útil, por ejemplo, si quieres mostrar algo como "El año actual es 2025".
import datetime
now = datetime.datetime.now()
print(f"Año: {now.year}")
print(f"Mes: {now.month}")
print(f"Día: {now.day}")
print(f"Hora: {now.hour}")
print(f"Minuto: {now.minute}")
print(f"Segundo: {now.second}")
print(f"Microsegundo: {now.microsecond}")
Crear una Fecha y Hora Específicas
Por supuesto, no solo puedes obtener la hora actual, sino también crear objetos que representen una fecha y hora específicas del pasado o del futuro. Esto se usa para especificar fechas como tu cumpleaños o el día de lanzamiento de un servicio.
import datetime
# Especificar el 1 de enero de 2026 a las 9:30:00
specific_datetime = datetime.datetime(2026, 1, 1, 9, 30, 0)
print(specific_datetime)
# Salida: 2026-01-01 09:30:00
Formatear Fechas y Horas para una Mejor Lectura
Un formato como `2025-07-11 07:42:15` no está mal, pero en un sitio web, a veces querrás mostrarlo de una forma más comprensible, como "11 de julio de 2025, 07:42". Para eso está el método `strftime()`.
Convertir a Cadena con el Formato que Quieras usando strftime()
`strftime()` es la abreviatura de "string format time" (formatear tiempo a cadena), y convierte un objeto `datetime` a una cadena de texto con un formato específico. Para especificar el formato, se usan "códigos de formato" como `%Y` o `%m`.
import datetime
import locale
# Establecer la localización en español para nombres de meses y días
# Puede requerir configuración en el sistema ('es_ES', 'es_ES.UTF-8', 'Spanish_Spain.1252', etc.)
try:
locale.setlocale(locale.LC_TIME, 'es_ES.UTF-8')
except locale.Error:
print("Localización 'es_ES.UTF-8' no soportada, usando la predeterminada.")
now = datetime.datetime.now()
# Convertir a cadena especificando un formato
# %d de %B de %Y es un formato común en español
formatted_string = now.strftime("%d de %B de %Y, %H:%M:%S")
print(formatted_string)
# Ejemplo de salida: 11 de julio de 2025, 07:42:15
Aquí tienes algunos de los códigos de formato más utilizados:
- `%Y`: Año con 4 dígitos (ej: 2025)
- `%y`: Año con 2 dígitos (ej: 25)
- `%m`: Mes como número con cero inicial (01-12)
- `%d`: Día del mes como número con cero inicial (01-31)
- `%H`: Hora en formato de 24 horas (00-23)
- `%I`: Hora en formato de 12 horas (01-12)
- `%p`: AM o PM según la configuración local
- `%M`: Minuto como número con cero inicial (00-59)
- `%S`: Segundo como número con cero inicial (00-59)
- `%A`: Nombre completo del día de la semana (ej: Viernes)
- `%a`: Nombre abreviado del día de la semana (ej: Vie)
- `%B`: Nombre completo del mes (ej: Julio)
Convertir una Cadena a Fecha y Hora con strptime()
Por el contrario, a veces querrás convertir datos en formato de cadena como "11/07/2025" a un objeto `datetime` que tu programa pueda manejar. En ese caso, se usa el método `strptime()`, que significa "string parse time" (analizar tiempo desde cadena).
Importante: Al usar `strptime()`, es crucial que el formato de la cadena original y el código de formato que especifiques coincidan perfectamente. Si no coinciden, obtendrás un error, así que ten cuidado.
import datetime
date_string = "11 de julio de 2025"
# Para que el mes "julio" sea reconocido, es posible que necesites configurar la localización
# import locale
# locale.setlocale(locale.LC_TIME, 'es_ES.UTF-8')
# Convertir la cadena a un objeto datetime especificando el formato
# En este ejemplo, como solo es una fecha, se convierte en un objeto date
date_obj = datetime.datetime.strptime(date_string, "%d de %B de %Y").date()
print(date_obj)
print(type(date_obj))
# Salida:
# 2025-07-11
# <class 'datetime.date'>
Avanzado: ¡Hagamos cálculos con fechas y horas!
El verdadero poder del módulo datetime reside en su capacidad para realizar cálculos con fechas y horas de forma sencilla. Puedes hacer operaciones intuitivas como "¿Qué fecha será dentro de una semana?" o "¿Cuántos días faltan para que termine la oferta?" usando objetos `timedelta`.
Expresar Diferencias de Tiempo con timedelta
Un `timedelta` es un objeto que representa una duración, es decir, la diferencia entre dos momentos en el tiempo. Se crea especificando días, segundos, microsegundos, etc.
import datetime
now = datetime.datetime.now()
print(f"Hora actual: {now.strftime('%Y-%m-%d %H:%M')}")
# Calcular la fecha de una semana después
una_semana_despues = now + datetime.timedelta(weeks=1)
print(f"Dentro de 1 semana: {una_semana_despues.strftime('%Y-%m-%d %H:%M')}")
# Calcular la fecha de hace 3 días
hace_tres_dias = now - datetime.timedelta(days=3)
print(f"Hace 3 días: {hace_tres_dias.strftime('%Y-%m-%d %H:%M')}")
# Calcular la hora 10 horas y 30 minutos después
diez_horas_despues = now + datetime.timedelta(hours=10, minutes=30)
print(f"En 10h 30min: {diez_horas_despues.strftime('%Y-%m-%d %H:%M')}")
Calcular la Diferencia Entre Dos Fechas
Cuando restas un objeto `datetime` de otro, el resultado es un objeto `timedelta`. Puedes usar esto para calcular, por ejemplo, el número de días que quedan hasta una fecha específica.
import datetime
# La fecha de hoy
hoy = datetime.date.today()
# Fecha objetivo (por ejemplo, el Año Nuevo de 2026)
ano_nuevo_2026 = datetime.date(2026, 1, 1)
# Calcular la diferencia entre las dos fechas
delta = ano_nuevo_2026 - hoy
print(f"Faltan {delta.days} días para el Año Nuevo de 2026.")
Un Punto a Considerar: La Trampa de las Zonas Horarias
Las fechas y horas que hemos manejado hasta ahora son, en realidad, objetos "ingenuos" (naive), que no tienen información de zona horaria. Esto está bien para scripts sencillos de uso personal, pero al crear un servicio web al que acceden usuarios de todo el mundo, las zonas horarias son un problema ineludible.
Por ejemplo, las "9 de la mañana del 11 de julio" en Japón y las "9 de la mañana del 11 de julio" en Estados Unidos son momentos completamente diferentes. Para manejar esta diferencia correctamente, necesitas usar objetos "conscientes" (aware), que sí contienen información de la zona horaria.
A partir de Python 3.9, puedes manejar zonas horarias fácilmente con el módulo `zoneinfo` de la biblioteca estándar.
import datetime
from zoneinfo import ZoneInfo
# Obtener la hora actual especificando una zona horaria
tz_tokio = ZoneInfo("Asia/Tokyo")
ahora_tokio = datetime.datetime.now(tz_tokio)
print(f"Hora actual en Tokio: {ahora_tokio}")
tz_nuevayork = ZoneInfo("America/New_York")
ahora_nuevayork = datetime.datetime.now(tz_nuevayork)
print(f"Hora actual en Nueva York: {ahora_nuevayork}")
# Se puede ver que la información de la zona horaria está adjunta
# Ejemplo de salida:
# Hora actual en Tokio: 2025-07-11 07:42:15.123456+09:00
# Hora actual en Nueva York: 2025-07-10 18:42:15.123456-04:00
Cuando desarrolles servicios internacionales, ¡asegúrate siempre de implementar la lógica teniendo en cuenta las zonas horarias!
[Práctica] ¡Copia, Pega y Ejecuta! Muestra la Hora Actual en una Página Web
Finalmente, usando lo que has aprendido, aquí tienes un ejemplo de HTML completo que puedes copiar y pegar para mostrar la Hora Estándar de Japón (JST) en tiempo real en una página web. Si guardas este código como un archivo HTML, funcionará simplemente abriéndolo en tu navegador.
※Este ejemplo incluye JavaScript dentro del HTML para actualizar la hora en tiempo real.
Guarda el siguiente código en un archivo llamado `reloj.html` y ábrelo en tu navegador.
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Visualización de la Hora en Tiempo Real</title>
<style>
body {
background-color: #202124;
color: #e8eaed;
font-family: sans-serif;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
flex-direction: column;
}
h1 {
color: #669df6;
}
#clock {
font-size: 3rem;
font-weight: bold;
background-color: #3c4043;
padding: 20px 40px;
border-radius: 10px;
}
</style>
</head>
<body>
<h1>Hora Actual en Japón</h1>
<div id="clock">--:--:--</div>
<script>
function updateClock() {
// Generar la hora en el Horario Estándar de Japón (JST, UTC+9)
const now = new Date();
const jstOffset = 9 * 60; // JST es UTC+9 horas
const localOffset = -now.getTimezoneOffset(); // Desplazamiento de la zona horaria local en minutos
const jstNow = new Date(now.getTime() + (jstOffset - localOffset) * 60 * 1000);
const hours = String(jstNow.getHours()).padStart(2, '0');
const minutes = String(jstNow.getMinutes()).padStart(2, '0');
const seconds = String(jstNow.getSeconds()).padStart(2, '0');
document.getElementById('clock').textContent = `${hours}:${minutes}:${seconds}`;
}
// Actualizar el reloj cada segundo
setInterval(updateClock, 1000);
// Ejecutar por primera vez al cargar la página
updateClock();
</script>
</body>
</html>
Resumen
En este artículo, hemos aprendido a manejar fechas y horas usando el módulo `datetime` de Python.
- Obtener la hora actual: `datetime.now()` y `date.today()`
- Conversión de formato: Convertir a cadena con `strftime()` y a objeto `datetime` con `strptime()`
- Cálculos de fecha/hora: Sumar y restar libremente con `timedelta`
- Zonas horarias: Para aplicaciones internacionales, es crucial usar objetos "conscientes" con `zoneinfo`
Una vez que domines el módulo `datetime`, se ampliará enormemente el abanico de cosas que puedes crear, como marcas de tiempo para logs, registro de fechas de alta de usuarios y cuentas regresivas para eventos. ¡No dudes en experimentar con el código de este artículo y prueba a crear tus propios programas!
Próximos Pasos
Ahora que te sientes cómodo manejando fechas y horas, ¿por qué no intentas con las operaciones de archivos y directorios? El siguiente artículo explica cómo leer y escribir archivos y crear/eliminar carpetas con Python.
Domina las Operaciones de Archivos y Directorios con el Módulo os »