calendar.timegm: convierte UTC a timestamp Unix

Publicado el: 14/09/2026
Tempo de leitura: 6 minutos
Desarrollador trabajando con timestamps UTC y calendar.timegm en Python

calendar.timegm es una función de la biblioteca estándar de Python que convierte una estructura de fecha y hora en un timestamp Unix interpretando todos los componentes como UTC. Es útil cuando un parser, protocolo, API antigua o función del sistema entrega una tupla compatible con time.gmtime() y necesitas obtener los segundos transcurridos desde la época Unix.

En esta guía aprenderás qué devuelve la función, cómo se diferencia de time.mktime(), cómo combinarla con datetime y zoneinfo, y cómo evitar errores sutiles de zona horaria en APIs, registros, tareas programadas y sistemas distribuidos.

Qué hace calendar.timegm

La función recibe una secuencia que contiene al menos año, mes, día, hora, minuto y segundo. Trata esos valores como una fecha UTC y devuelve el timestamp correspondiente. La época Unix comienza el 1 de enero de 1970 a las 00:00:00 UTC.

import calendar

tupla_utc = (2026, 9, 14, 12, 0, 0)
timestamp = calendar.timegm(tupla_utc)
print(timestamp)

La función es el inverso práctico de time.gmtime(). Mientras gmtime convierte un timestamp en una estructura UTC, timegm convierte la estructura nuevamente en segundos.

Conversión de ida y vuelta

import calendar
import time

original = time.time()
estructura = time.gmtime(original)
restaurado = calendar.timegm(estructura)
print(original, restaurado)

El valor restaurado normalmente pierde la parte fraccionaria porque struct_time trabaja con segundos enteros. Este patrón es útil en colas de mensajes, auditorías y protocolos que intercambian timestamps enteros.

Diferencia frente a time.mktime

time.mktime() interpreta la entrada como hora local. Por eso, la misma tupla puede producir timestamps distintos en servidores configurados en regiones diferentes. calendar.timegm() siempre interpreta los valores como UTC.

import calendar
import time

valor = (2026, 9, 14, 9, 0, 0, 0, 0, -1)
print(calendar.timegm(valor))
print(time.mktime(valor))

Si la tupla representa tiempo universal, usar mktime puede desplazar silenciosamente el instante según el offset local. Usa timegm cuando UTC forme parte del contrato de datos.

Uso con struct_time

Un objeto struct_time es válido porque se comporta como una secuencia. Los campos adicionales, como día de la semana y día del año, no sustituyen los componentes principales.

import calendar
import time

estructura = time.strptime("2026-09-14 12:30:00", "%Y-%m-%d %H:%M:%S")
timestamp = calendar.timegm(estructura)

strptime analiza el texto, pero no demuestra que la fuente esté en UTC. La aplicación debe conocer y documentar el significado de la zona horaria.

Comparación con datetime.timestamp

El código moderno suele usar objetos datetime conscientes de zona porque conservan más contexto.

from datetime import datetime, timezone

fecha = datetime(2026, 9, 14, 12, 0, tzinfo=timezone.utc)
print(fecha.timestamp())

Esta suele ser la opción más clara cuando la aplicación ya trabaja con datetime. Sin embargo, calendar.timegm sigue siendo conveniente para interfaces basadas en tuplas y para dejar explícito que una estructura representa UTC.

Convertir datetime mediante una tupla UTC

import calendar
from datetime import datetime, timezone

ahora = datetime.now(timezone.utc)
timestamp = calendar.timegm(ahora.utctimetuple())

Esta conversión descarta los microsegundos. Usa ahora.timestamp() si necesitas precisión inferior al segundo.

El problema de datetime sin zona

Un datetime naive no contiene información de zona horaria. Interpretarlo como UTC sin conocer su origen es peligroso. Un valor 09:00 podría representar São Paulo, Madrid, Nueva York o UTC.

from datetime import datetime, timezone

naive = datetime(2026, 9, 14, 9, 0)
utc_explicito = naive.replace(tzinfo=timezone.utc)

replace no convierte el instante. Solo declara que los números existentes pertenecen a UTC. Úsalo únicamente cuando esa afirmación sea correcta.

Conversión regional con zoneinfo

from datetime import datetime
from zoneinfo import ZoneInfo

local = datetime(2026, 9, 14, 9, 0, tzinfo=ZoneInfo("America/Sao_Paulo"))
utc = local.astimezone(ZoneInfo("UTC"))
print(utc.timestamp())

Las zonas regionales consideran reglas históricas de offset. Convertir con zoneinfo es más seguro que sumar o restar horas manualmente.

Entradas de API

Una API debería aceptar un formato documentado, idealmente ISO 8601 con offset. Analiza el valor como un objeto consciente de zona antes de convertirlo.

from datetime import datetime

texto = "2026-09-14T12:00:00+00:00"
fecha = datetime.fromisoformat(texto)
timestamp = int(fecha.timestamp())

Usa calendar.timegm cuando el protocolo ya entregue una tupla UTC. No elimines el offset de una cadena para después tratar los números restantes como UTC.

Timestamps negativos

Muchas plataformas modernas admiten timestamps negativos para fechas anteriores a 1970. El rango exacto puede variar según el sistema operativo y la compilación de Python. Las aplicaciones históricas deben probar los límites requeridos en todos sus entornos.

Segundos intercalares

Los timestamps Unix tradicionales no modelan segundos intercalares como segundos ordinarios separados. Python sigue el comportamiento temporal de la plataforma y no pretende ser una biblioteca de escala astronómica. Para requisitos científicos, utiliza una librería especializada.

Validación de entrada

Los componentes externos deben validarse. Construir un datetime permite rechazar combinaciones imposibles.

from datetime import datetime, timezone

try:
    valor = datetime(2026, 2, 30, tzinfo=timezone.utc)
except ValueError as error:
    print("Fecha inválida", error)

También conviene limitar el rango de años, rechazar tipos inesperados y registrar claramente si la fuente es UTC o una hora regional.

Pruebas deterministas

El código de fechas es más fácil de probar con valores UTC fijos. Verifica el timestamp esperado y la conversión inversa.

import calendar
import time

def test_timegm_roundtrip():
    origen = (2026, 9, 14, 12, 0, 0, 0, 0, 0)
    timestamp = calendar.timegm(origen)
    resultado = time.gmtime(timestamp)
    assert resultado[:6] == origen[:6]

Evita pruebas cuyo resultado dependa de la zona horaria del servidor de integración continua. Las pruebas UTC son portables y fáciles de revisar.

Segundos, milisegundos y microsegundos

calendar.timegm devuelve segundos enteros. Navegadores y ecosistemas Java suelen usar milisegundos. Bases de datos y telemetría pueden usar microsegundos o nanosegundos. Documenta siempre la unidad.

segundos = calendar.timegm((2026, 9, 14, 12, 0, 0))
milisegundos = segundos * 1000

Un valor correcto en una unidad incorrecta puede aparecer como una fecha absurda. La confusión de unidades es uno de los errores más frecuentes en integraciones.

Logs y sistemas distribuidos

Los timestamps UTC permiten ordenar eventos producidos en regiones diferentes. Los servicios deberían guardar el instante en UTC y convertirlo a la zona del usuario únicamente al presentarlo.

evento = {
    "nombre": "tarea_finalizada",
    "timestamp": calendar.timegm((2026, 9, 14, 12, 0, 0)),
}

Si el orden de eventos exige más precisión, conserva también microsegundos o utiliza un entero de mayor resolución.

Tareas programadas

Un planificador suele recibir una hora regional. Convierte esa hora con zoneinfo y guarda después el instante UTC. No pases directamente una tupla regional a timegm, porque la función la interpretará como UTC.

Almacenamiento en bases de datos

Una base de datos puede guardar fechas como tipos nativos, cadenas ISO o enteros Unix. Sea cual sea la representación, define la zona y la precisión. Los enteros son compactos, pero no conservan la zona original ni la intención de formato.

Errores frecuentes

Los problemas habituales incluyen pasar hora local a timegm, usar mktime con datos UTC, perder microsegundos sin advertirlo, mezclar segundos y milisegundos, asumir que una tupla contiene información de zona y depender de la configuración del servidor.

Buenas prácticas

Mantén los instantes internos en UTC, usa objetos conscientes de zona en los límites, convierte horas regionales con zoneinfo, valida los componentes externos, documenta las unidades y reserva calendar.timegm para estructuras que realmente representen UTC.

Guías relacionadas de Academify

Continúa con las guías de Academify sobre datetime en Python, zoneinfo en Python, módulo time y fechas en Python.

Referencias externas

Consulta la documentación oficial de calendar.timegm y la documentación oficial de datetime para revisar el comportamiento y la compatibilidad.

Conclusión

calendar.timegm ofrece una conversión específica y predecible de una tupla UTC a un timestamp Unix. Evita la interpretación local de time.mktime y se combina naturalmente con time.gmtime. Los objetos datetime conscientes de zona suelen ser más expresivos en aplicaciones nuevas, pero timegm continúa siendo una herramienta fiable para protocolos basados en tuplas, registros, parsers, planificadores e integraciones antiguas donde UTC está explícito.

Compartilhe:

Facebook
WhatsApp
Twitter
LinkedIn

Contenido del artículo

    Artículos relacionados

    Programador analizando código para identificar tipos MIME de archivos con Python
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    mimetypes.guess_file_type: detecta tipos MIME

    Aprende mimetypes.guess_file_type en Python para detectar tipos MIME en rutas, URLs, uploads y respuestas HTTP con fallbacks seguros.

    Ler mais

    Tempo de leitura: 4 minutos
    13/09/2026
    Componentes de servidor que representan intérpretes Python aislados ejecutándose en paralelo
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    InterpreterPoolExecutor: paralelismo real en Python

    Aprende InterpreterPoolExecutor en Python para tareas CPU-bound, intérpretes aislados, paralelismo real y concurrencia segura.

    Ler mais

    Tempo de leitura: 6 minutos
    13/09/2026
    Microprocesador que representa las CPU disponibles para un proceso Python
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    os.process_cpu_count: cuenta CPUs disponibles

    Aprende os.process_cpu_count en Python para dimensionar workers según las CPU disponibles para el proceso.

    Ler mais

    Tempo de leitura: 4 minutos
    12/09/2026
    Portátil con código digital que representa datos BLOB en SQLite
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    sqlite3.Blob: lee BLOBs sin cargar todo en memoria

    Aprende sqlite3.Blob en Python para leer y escribir BLOBs por partes, reducir memoria y manejar datos binarios en SQLite.

    Ler mais

    Tempo de leitura: 5 minutos
    12/09/2026
    Análisis estadístico para random.binomialvariate en Python
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    random.binomialvariate: simula resultados binomiales

    Aprende random.binomialvariate en Python para simular éxitos, validar probabilidades y analizar escenarios binomiales con ejemplos.

    Ler mais

    Tempo de leitura: 5 minutos
    11/09/2026
    Código Python y análisis de firmas de funciones
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    inspect.signature.bind: valida argumentos de funciones

    Aprende inspect.signature.bind en Python para validar argumentos, aplicar valores predeterminados y crear APIs dinámicas seguras.

    Ler mais

    Tempo de leitura: 5 minutos
    11/09/2026