Guía
Problema del año 2038: qué ocurre con los timestamps Unix de 32 bits
Entiende el límite 2147483647, la fecha del desbordamiento de 2038 y cómo comprobar si un sistema sigue usando tiempo con signo de 32 bits.
por Tools in a Tab · Publicado el · Revisado el
Respuesta breve
El problema del año 2038 afecta a sistemas que almacenan los segundos desde el
Unix epoch en un entero con signo de 32 bits. Su máximo es 2147483647, que
corresponde a 2038-01-19 03:14:07 UTC. Un segundo después ya no cabe en esa
representación, aunque Unix time y los sistemas con rangos mayores continúan.
El límite exacto
Un entero con signo de 32 bits reserva un bit para el signo y dispone de 31 bits para el valor positivo:
máximo = 2³¹ - 1 = 2147483647 segundos
La conversión conocida es:
2147483647 → 2038-01-19T03:14:07Z
2147483648 → 2038-01-19T03:14:08Z
El segundo valor es un timestamp válido como número, pero no cabe en un entero con signo de 32 bits. Puedes comprobar ambas fechas con el conversor de timestamp Unix seleccionando segundos y UTC.
Qué significa «desbordar»
El resultado depende del lenguaje, almacenamiento y operación. Un sistema que hace aritmética con envoltura podría reinterpretar el bit más alto y producir un valor negativo. Otro puede lanzar un error, rechazar la fecha o saturar el campo. No hay una única fecha incorrecta garantizada para todos los programas.
El fallo no está en la definición del instante, sino en el tipo usado para guardarlo o transportarlo. Cambiar la visualización no amplía ese tipo.
Qué sistemas debes revisar
- Bases de datos con columnas enteras de 32 bits para segundos Unix.
- Formatos binarios y protocolos que fijan un campo firmado de cuatro bytes.
- Firmware, dispositivos antiguos y sistemas embebidos con ABI heredada.
- Código que convierte un timestamp mayor a un tipo estrecho antes de validarlo.
- Cálculos de caducidad, certificados o calendarios que ya proyectan fechas más allá de 2038.
Un equipo puede usar un sistema operativo moderno y conservar el problema en un archivo, una base de datos o una dependencia que mantenga el formato viejo.
Segundos, milisegundos y JavaScript
Multiplicar por mil no soluciona el problema si el destino sigue siendo un
entero de 32 bits: el límite se alcanza mucho antes. JavaScript Date trabaja
con un valor numérico de milisegundos y tiene un rango distinto; que una fecha
funcione en el navegador no demuestra que quepa en el sistema receptor.
Conserva la unidad junto al dato y prueba los límites del contrato, no solo los de la interfaz utilizada para convertirlo.
Cómo probar una integración
Incluye al menos estos casos:
0, para verificar el epoch.2147483647, último segundo del rango firmado de 32 bits.2147483648, primer valor fuera de ese rango.- Una fecha operativa posterior, como 2040.
- Un valor negativo si el producto admite fechas anteriores a 1970.
Comprueba el valor almacenado, la respuesta de la API y la fecha UTC recuperada. Una prueba que solo valida que la petición no falla puede ocultar una fecha truncada.
Mitigación
Utiliza una representación con rango suficiente de extremo a extremo y migra los datos antes de depender de fechas posteriores. Documenta la unidad, la signatura y el ancho; valida antes de convertir; y revisa todas las fronteras donde el valor cambia de tipo.
La justificación de POSIX sobre
segundos desde el epoch
documenta el desbordamiento en 2038 de implementaciones con time_t firmado de
32 bits. El riesgo es concreto para esa representación, no una caducidad
universal de los timestamps Unix.