Preguntas frecuentes sobre timestamps Unix

Respuestas rápidas a las preguntas más comunes sobre timestamps Unix — unidades, manejo de zonas horarias, el problema del año 2038, conversiones específicas de cada lenguaje y más.

Preguntas frecuentes

Preguntas comunes sobre marcas de tiempo Unix, tiempo epoch, zonas horarias y cómo almacenar el tiempo correctamente, organizadas por tema. Usa las respuestas como referencia rápida; al final de la página hay enlaces a guías más detalladas.

Adónde ir después

FAQ

¿Qué es una marca de tiempo Unix?
Una marca de tiempo Unix es el número de segundos transcurridos desde el epoch Unix — el 1 de enero de 1970 a las 00:00:00 UTC. Es un entero neutral respecto al lenguaje e independiente de la zona horaria que identifica de forma única cualquier momento en el tiempo.
¿Qué es el epoch Unix?
El epoch Unix es el 1 de enero de 1970 a las 00:00:00 UTC. Todas las marcas de tiempo Unix se miden hacia delante — o hacia atrás para valores negativos — desde este punto de referencia fijo. La elección de 1970 fue práctica: era un año reciente y redondo cuando se diseñaba Unix en los Bell Labs.
¿Cuál es la diferencia entre una marca de tiempo de 10 dígitos y una de 13?
Una marca de tiempo de 10 dígitos (p. ej. 1700000000) representa segundos desde el epoch. Una de 13 dígitos (p. ej. 1700000000000) representa milisegundos. El Date.now() de JavaScript devuelve milisegundos; la mayoría de las llamadas del sistema Unix y lenguajes como Python, Go y PHP devuelven segundos por defecto.
¿Por qué JavaScript usa milisegundos en lugar de segundos?
La API Date de JavaScript se diseñó para coincidir con la resolución de los temporizadores del sistema disponibles en 1995. Usar milisegundos evita la pérdida de precisión en duraciones de menos de un segundo. Cuando trabajes con marcas de tiempo Unix en segundos generadas por el servidor, multiplica por 1000 antes de pasarlas a new Date().
¿Cómo convierto una marca de tiempo Unix a una fecha legible en JavaScript?
Para una marca en segundos: new Date(1700000000 * 1000).toISOString(). Para una marca en milisegundos: new Date(1700000000000).toISOString(). Ambas producen cadenas ISO 8601 como '2023-11-15T06:13:20.000Z'. Usa toLocaleString() con una opción timeZone para una visualización localizada.
¿Las marcas de tiempo Unix tienen en cuenta la zona horaria?
No. Una marca de tiempo Unix siempre representa un único momento en UTC. La información de zona horaria solo se aplica al formatear la marca para mostrarla. Dos dispositivos en zonas horarias distintas producirán la misma marca de tiempo Unix para el mismo instante.
¿Qué es el problema del año 2038?
Los sistemas que almacenan marcas de tiempo Unix como enteros con signo de 32 bits solo pueden representar valores hasta 2 147 483 647, que corresponde al 19 de enero de 2038 a las 03:14:07 UTC. Tras ese momento el entero se desborda a un número negativo grande. Los sistemas modernos de 64 bits no se ven afectados, pero los sistemas embebidos y las bases de datos heredadas pueden seguir en riesgo.
¿Qué es una marca de tiempo Unix negativa?
Una marca de tiempo Unix negativa representa un momento anterior al epoch Unix. Por ejemplo, -86400 es el 31 de diciembre de 1969 a las 00:00:00 UTC. La mayoría de las APIs de fecha modernas manejan correctamente las marcas negativas, pero algunos sistemas y bases de datos más antiguos no las admiten.
¿Cómo obtengo una marca de tiempo Unix en Python?
Usa import time; int(time.time()) para segundos. Para un datetime UTC explícito: import datetime; int(datetime.datetime.now(datetime.timezone.utc).timestamp()). Para milisegundos: int(time.time() * 1000).
¿Qué precisión tiene una marca de tiempo Unix?
Una marca de tiempo Unix estándar tiene precisión de un segundo. Para precisión por debajo del segundo, las marcas en milisegundos (13 dígitos) son comunes en APIs web y JavaScript. Algunos sistemas usan microsegundos (16 dígitos) o nanosegundos. La unidad adecuada depende de la precisión que tu aplicación realmente necesite.
¿Cómo de grande puede ser una marca de tiempo Unix?
En un entero con signo de 64 bits (el estándar actual), las marcas de tiempo Unix pueden representar cualquier momento desde hace unos 292 000 millones de años hasta dentro de 292 000 millones de años. El famoso límite de 32 bits (el problema del año 2038) solo se aplica a los sistemas heredados.
¿Por qué mi marca de tiempo muestra 1970?
Normalmente por una de tres razones: el valor es 0 (el propio epoch), el valor está en milisegundos pero se trató como segundos (por lo que se redondea a un valor de segundos minúsculo cercano a 0), o el valor es null/undefined y tu código lo dejó por defecto en 0.
¿Cuál es la diferencia entre UTC y GMT?
Para la mayoría de los fines, UTC y GMT son intercambiables. UTC (Tiempo Universal Coordinado) es el estándar atómico moderno; GMT (Hora del Meridiano de Greenwich) es un término heredado para la zona horaria con desfase cero. El Reino Unido y la mayoría del software los tratan como equivalentes.
¿Debería almacenar fechas como marcas de tiempo Unix o como cadenas ISO 8601?
Ambas funcionan. Los enteros Unix son compactos y triviales de comparar; las cadenas ISO 8601 son autodescriptivas y legibles por humanos. En bases de datos, los tipos datetime nativos (TIMESTAMP WITH TIME ZONE en Postgres, DATETIME(6) en MySQL) suelen ser lo mejor porque preservan la semántica de zona horaria e indexan de forma eficiente.
¿Es seguro almacenar la hora local de mi servidor?
No. Almacenar la hora local sin un desfase pierde información cada vez que el servidor se traslada, cambia el DST u otro servidor en otra zona lee el valor. Almacena UTC (como marca de tiempo Unix o un datetime con zona horaria) y convierte a hora local solo en la capa de visualización.
¿Las marcas de tiempo Unix incluyen segundos intercalares?
El tiempo Unix POSIX ignora deliberadamente los segundos intercalares — cada día Unix tiene exactamente 86 400 segundos incluso cuando se inserta un segundo UTC adicional. El número de segundo real se repite o el reloj se suaviza, según el sistema.