Marca de tiempo, problema del año 2038 para el sistema Ubuntu de 64 bits

24

Estoy usando el sistema Ubuntu de 64 bits.

Actualmente estoy trabajando en un proyecto que incorpora MariaDB. Estoy planeando introducir una técnica de marca de tiempo en el proyecto para que las personas reciban la hora correcta para diferentes zonas horarias.

He escuchado y leído algunos artículos sobre el problema del año 2038 para la marca de tiempo. Muchos artículos sugieren que usemos un sistema de 64 bits para comprar un poco más de tiempo.

¿A cuánto tiempo se refiere este "bit"? ¿Es lo suficientemente largo para que podamos administrar aplicaciones web hasta el final? Si ese no es el caso, ¿es como una extensión de solo dos años, entonces cuando llegue el año 2040, vamos a tener aplicaciones que no funcionen adecuadamente?

tet
fuente
27
Los sistemas de 64 bits que usan time_tenteros de 64 bits le darán un 'bit' más de tiempo, hasta las 15:30:08 del domingo 4 de diciembre de 292,277,026,596. Espero que sea lo suficientemente largo para su aplicación;)
Ron
44
No te da "un poco" más. Te da exactamente 32 bits más.
user12205
55
Las marcas de tiempo de 64 bits es otra de esas medidas provisionales. ¿Qué pasa con las personas que trabajan en el Proyecto Utopía en 100,000,000,000,000 CE? ¡También van a necesitar sistemas informáticos funcionales! El uso de marcas de tiempo de 128 bits nos permitiría identificar de manera única en cualquier momento no solo esta iteración del universo, sino muchos, muchos otros.
Blacklight Shining
1
Como nunca antes ha aceptado ninguna respuesta en este sitio: si una de las respuestas a continuación lo ayudó, no olvide hacer clic en el gris a la izquierda de su texto, lo que significa que sí, ¡esta respuesta es válida ! ;-)
Fabby

Respuestas:

34

Bueno, si hay una opción para comprar literalmente un "bit", es decir, transferir de un entero de 32 bits con signo a un entero de 32 bits sin signo, las cosas siguen funcionando en 2106.

La transferencia a 64 bits es "algo mejor". Obtienes cientos de miles de millones de años de resolución.

Y Ubuntu hace esto:

$ uname -p
x86_64

$ date --date=9090-01-01 +%s
224685532800

Sin embargo, ese es el nivel del sistema operativo. El hecho de que Ubuntu use un número entero de 64 bits para sus tiempos no significa que MySQL / MariaDB lo usará para almacenar sus marcas de tiempo. Si las fechas anteriores a 2038 son importantes para su ahora, comience a realizar las pruebas de inmediato.

En realidad, puedo ahorrarte algo de tiempo. Todavía está roto Este error se informó hace más de una década, pero su prueba principal todavía falla con un int de 64 bits.

mysql> select from_unixtime(2548990800);
+---------------------------+
| from_unixtime(2548990800) |
+---------------------------+
| NULL                      |
+---------------------------+
1 row in set (0.00 sec)

Esto ni siquiera es almacenamiento. Es un poco patético.

(Y sí, eso se ejecutó en MariaDB, versión 10.1)

Oli
fuente
8
Hace 10 años, todavía tienen 22 años para arreglarlo. <Cruza los dedos> ...
Mindwin
44
NB: el uso de enteros de 32 bits sin signo es un truco .
Kevin
6

No lo guardes como un entero en absoluto. Almacénelo como una cadena de fecha con formato ISO 8601 . Este es el formato estándar utilizado en Internet.

9999-12-31T23:59:59+00:00
dobey
fuente
17
¡Levantemos un vaso para el Bug del Año10K! ;) Pero en serio, aunque las cadenas son realmente extensibles, son relativamente grandes (¡tu ejemplo es de 200 bits!) Y analizar y manipular números primitivos es muchísimo más rápido. Eso importa.
Oli
66
Este es un gran formato para mostrar, y solo para eso. Para cualquier otra cosa (es decir, manejar los datos hasta el último momento en que decide formatearlos para el usuario), como comparar, hacer aritmética, etc., la marca de tiempo de Unix como un entero (o flotante) es mucho mejor.
egmont
1
@Oli Importa, si realmente importa. Esta solución no falla cuando hay tiempos más antiguos que la época de UNIX. El formato es el estándar utilizado para las fechas en todo Internet, en protocolos y API. Si está almacenando algo en una columna MariaDB, entonces realmente es cómo debe almacenarlo en el disco. Claro, en memoria, tal vez quieras almacenarlo en una estructura de datos más accesible. Y no necesita los últimos 40 bits si siempre usa UTC.
Dobey