Unix Timestamp Explicado

¿Qué es una marca de tiempo Unix?

Una marca de tiempo Unix (también llamada tiempo POSIX o tiempo Epoch) es un único número entero que representa la cantidad de segundos transcurridos desde las 00:00:00 UTC del jueves 1 de enero de 1970, un punto de referencia conocido como la Época Unix. Por ejemplo, la marca de tiempo 1700000000 corresponde al 14 de noviembre de 2023, 22:13:20 UTC.

¿Por qué 1970?

Los sistemas operativos tipo Unix se desarrollaron a finales de los años 60 y principios de los 70. El año 1970 se eligió como un punto de partida conveniente y redondo, cercano al origen del propio Unix. No tenía ningún significado astronómico o político especial: simplemente era práctico.

Propiedades clave

  • Siempre en UTC: las marcas de tiempo Unix no dependen de la zona horaria. Siempre se refieren al UTC, sin importar dónde se encuentre el servidor o el cliente.
  • Entero o decimal: los segundos completos usan un entero simple. La precisión de fracciones de segundo usa un decimal (por ejemplo, 1700000000.456).
  • Variantes en milisegundos: Date.now() de JavaScript devuelve milisegundos desde la época, no segundos: verifica siempre las unidades.
  • Sin conciencia de segundos intercalares: la escala de tiempo Unix ignora los segundos intercalares, lo que puede hacer que se desvíe ligeramente del UTC real en torno a los eventos de segundo intercalar.

Obtener la marca de tiempo actual

Todos los lenguajes de programación principales ofrecen una forma integrada de leer la marca de tiempo Unix actual:

# Python
import time
print(int(time.time()))          # e.g. 1700000000

# JavaScript
console.log(Date.now())          // milliseconds — divide by 1000 for seconds
console.log(Math.floor(Date.now() / 1000))

# Bash
date +%s

# SQL (PostgreSQL)
SELECT EXTRACT(EPOCH FROM NOW())::BIGINT;

Convertir una marca de tiempo a una fecha legible

# Python
from datetime import datetime, timezone
dt = datetime.fromtimestamp(1700000000, tz=timezone.utc)
print(dt.isoformat())   # 2023-11-14T22:13:20+00:00

# JavaScript
new Date(1700000000 * 1000).toISOString()
// "2023-11-14T22:13:20.000Z"

Errores comunes

  • Milisegundos frente a segundos: confirma siempre si una API devuelve ms o s. Dividir entre 1000 innecesariamente produce fechas en 1970.
  • Desbordamiento de 32 bits: en sistemas que usan un entero con signo de 32 bits, las marcas de tiempo desbordarán en 2038. Consulta la guía sobre el problema del año 2038.
  • Marcas de tiempo negativas: las fechas anteriores a 1970 se representan como enteros negativos, que la mayoría de los lenguajes modernos manejan correctamente.

Cuándo usar marcas de tiempo Unix

Las marcas de tiempo Unix son ideales para almacenar y comparar fechas en bases de datos, APIs y registros. Son compactas, ordenables, neutrales respecto a la zona horaria e inequívocas. Para mostrarlas a los usuarios, siempre conviértelas a una fecha y hora local con el manejo adecuado de la zona horaria.