Ir al contenido principal
Tecnología

Marcas de tiempo Unix - Cómo las computadoras representan el tiempo con un solo número

¿Qué es una marca de tiempo Unix?

Una marca de tiempo Unix (también llamada tiempo POSIX o tiempo epoch) es el número de segundos transcurridos desde el 1 de enero de 1970 a las 00:00:00 UTC. Este instante se conoce como la época Unix. Por ejemplo, la marca de tiempo 1.000.000.000 corresponde al 9 de septiembre de 2001 a las 01:46:40 UTC. La marca 0 es la época misma, y los valores negativos representan fechas anteriores a 1970.

Esta representación se eligió para el sistema operativo Unix original a principios de los años 70 porque ofrece una forma simple e inequívoca de registrar cualquier instante como un único entero. A diferencia de los formatos de fecha legibles por humanos, una marca de tiempo Unix no tiene zona horaria, ni reglas de horario de verano, ni peculiaridades del calendario. Dos sistemas en cualquier parte del mundo siempre coincidirán en el significado de una marca de tiempo dada, lo que la hace ideal para la computación distribuida.

Conversión de marcas de tiempo a fechas legibles

Para convertir una marca de tiempo Unix a una fecha y hora local, se suma la marca a la época y luego se aplica el desfase UTC correspondiente a la zona horaria deseada. La marca 1.715.356.800 representa el 11 de mayo de 2024 a las 00:00:00 UTC. En Tokio (UTC+9), esto es el 11 de mayo a las 09:00. En Nueva York durante EDT (UTC-4), es el 10 de mayo a las 20:00. La misma marca produce horas locales diferentes según dónde te encuentres.

La mayoría de los lenguajes de programación proporcionan funciones integradas para esta conversión. En JavaScript, `new Date(timestamp * 1000)` crea un objeto Date (JavaScript usa milisegundos, por lo que se multiplica por 1000). En Python, `datetime.fromtimestamp(timestamp, tz=timezone.utc)` devuelve un datetime con zona horaria. Estas funciones manejan internamente los años bisiestos, la longitud de los meses y otras complejidades del calendario.

Milisegundos, microsegundos y nanosegundos

Aunque la marca de tiempo Unix clásica cuenta segundos enteros, muchos sistemas modernos usan mayor precisión. `Date.now()` de JavaScript devuelve milisegundos desde la época (13 dígitos en lugar de 10). Sistemas de bases de datos como PostgreSQL admiten precisión de microsegundos. Los sistemas de trading de alta frecuencia e instrumentos científicos pueden usar marcas en nanosegundos. Al trabajar con marcas de distintas fuentes, verifica siempre la unidad para evitar errores de un factor de 1000.

Una fuente habitual de errores es mezclar marcas basadas en segundos con las basadas en milisegundos. Si pasas una marca en milisegundos a una función que espera segundos, obtienes una fecha de millones de años en el futuro. A la inversa, tratar una marca en segundos como milisegundos te sitúa en enero de 1970. Una comprobación rápida: un número de 10 dígitos son segundos (era actual), uno de 13 dígitos son milisegundos y uno de 16 dígitos son microsegundos.

El problema del año 2038

Los sistemas Unix tradicionales almacenan las marcas de tiempo como un entero de 32 bits con signo, que puede representar valores hasta 2.147.483.647. Este máximo corresponde al 19 de enero de 2038 a las 03:14:07 UTC. Un segundo después, el valor se desborda y vuelve a un número negativo grande, que los sistemas interpretan como el 13 de diciembre de 1901. Es un problema análogo al Y2K pero afecta a un nivel más bajo de la pila de software.

La mayoría de los sistemas modernos ya han migrado a marcas de 64 bits, que no se desbordarán en aproximadamente 292 mil millones de años. Linux completó su transición a tiempo de 64 bits a nivel del kernel en la versión 5.6 (2020). Sin embargo, los sistemas embebidos, dispositivos IoT y software heredado con código de 32 bits siguen siendo vulnerables. Los formatos de archivo que almacenan marcas de 32 bits (como algunos formatos de archivo antiguos) también necesitarán actualizaciones antes de 2038.

Usos prácticos de las marcas de tiempo Unix

Las marcas de tiempo Unix son omnipresentes en el desarrollo de software. Las respuestas de API suelen incluir marcas para fechas de creación, modificación y expiración. Los archivos de registro usan marcas para ordenar eventos en sistemas distribuidos. Las bases de datos indexan columnas de marca de tiempo para consultas de rango eficientes. Los sistemas de caché usan marcas para determinar cuándo los datos en caché han expirado.

Para los usuarios finales, entender las marcas de tiempo Unix resulta útil al depurar respuestas de API, leer registros de servidor o trabajar con exportaciones de datos. Muchas herramientas en línea y utilidades de línea de comandos pueden convertir entre marcas y fechas legibles. En una terminal, `date -d @1715356800` (Linux) o `date -r 1715356800` (macOS) convierte una marca a una cadena de fecha local. Saber leer y convertir estos números ahorra tiempo al resolver problemas relacionados con el tiempo en cualquier sistema técnico.

XB!LINE

¿Te resultó útil este artículo?