Tiempo Unix 0: El Inicio del Tiempo Unix
El tiempo Unix 0 es el 1 de enero de 1970 00:00:00 UTC. Cada tiempo Unix es el número de segundos transcurridos desde este momento. El tiempo Unix 1 es un segundo después. El tiempo Unix 86400 es exactamente un día después, el 2 de enero de 1970.
# Verificar en la terminal
date -d @0 # Linux
date -r 0 # macOS
# Ambos muestran: Thu Jan 1 00:00:00 UTC 1970
Como se Eligió el Epoch
Unix comenzó a desarrollarse en Bell Labs en 1969. La implementación original en PDP-7 usaba una base de tiempo diferente. El formato de tiempo Unix se estabilizo durante la migración a PDP-11 entre 1971 y 1973.
La elección del 1 de enero de 1970 fue pragmatica más que basada en principios:
- Estaba cerca de la fecha actual durante el desarrollo y maximizaba el rango útil de tiempos Unix positivos.
- En un sistema de 32 bits, un entero con signo da aproximadamente 68 años de valores positivos (2^31 segundos ≈ 68.05 años). Comenzando en 1970, este rango se extiende hasta 2038.
- Un limite de fecha de calendario en la medianoche UTC (1 de enero) era un punto de partida natural y claro.
Tiempos Unix Negativos: Antes de 1970
El tiempo Unix -86400 es el 31 de diciembre de 1969 00:00:00 UTC. Yendo más atras, -2208988800 es el 1 de enero de 1900, el epoch usado por NTP (Protocolo de Tiempo de Red).
Segundos vs Milisegundos: Una Fuente Persistente de Errores
El tiempo Unix se define en segundos. Sin embargo, el objeto Date de JavaScript (y la mayoría de las API del navegador) usa milisegundos:
Date.now() // milisegundos desde el epoch, ej. 1700000000000
Math.floor(Date.now() / 1000) // convertir a segundos: 1700000000
El error canonico: lees un tiempo Unix en segundos desde una base de datos, lo pasas directamente a new Date() sin multiplicar por 1000, y obtienes una fecha en enero de 1970 en lugar de 2023.
Como Diferentes Sistemas Representan el Mismo Instante
El instante 1 de enero de 2024 00:00:00 UTC:
| Sistema | Representación | Notas |
|---|---|---|
| Unix (segundos) | 1704067200 | Estándar C/POSIX |
| Unix (milisegundos) | 1704067200000 | JavaScript Date |
| Windows FILETIME | 133603488000000000 | 100-ns intervalos desde 1601 |
| OLE Automation | 45291.0 | Double desde 1900 |
| NTP | 3866497216 | Segundos desde 1900 |
Segundos Intercalares y Tiempo Unix
El tiempo Unix idealmente cuenta segundos SI, pero los días no tienen exactamente 86400 segundos SI porque la rotación de la Tierra se esta frenando. Los segundos intercalares (leap seconds) se añaden ocasionalmente al UTC para mantenerlo sincronizado con el tiempo astronomico. El tratamiento de Unix para los segundos intercalares es controversial: la mayoría de las implementaciones repiten o saltan un segundo, lo que significa que una representación de tiempo Unix no es estrictamente un conteo de segundos SI.