Data e ora, problema dell'anno 2038 per il sistema Ubuntu a 64 bit


24

Sto usando il sistema Ubuntu a 64 bit.

Attualmente sto lavorando a un progetto che incorpora MariaDB. Sto pianificando di introdurre la tecnica del timestamp nel progetto in modo che le persone ricevano l'ora corretta per fuso orario diverso.

Ho sentito e letto alcuni articoli sul problema dell'anno 2038 per il timestamp. Molti articoli suggeriscono di utilizzare un sistema a 64 bit per acquistare un "bit" più tempo.

A quanto tempo si riferisce questo "bit"? È abbastanza lungo per noi essere in grado di gestire le applicazioni Web fino alla fine? In caso contrario, è come solo un'estensione di due anni, quindi quando arriverà l'anno 2040, avremo applicazioni che non funzionano in modo appropriato?


27
I sistemi a 64 bit che utilizzano time_tnumeri interi a 64 bit ti daranno un po 'più tempo - fino alle 15:30:08 di domenica 4 dicembre 292.277.026.596. Spero che sia abbastanza lungo per la tua applicazione;)
Ron,

4
Non ti dà un po 'di più. Ti dà esattamente 32 bit in più.
user12205

5
Il timestamp a 64 bit è un'altra di quelle misure di stopgap. E le persone che lavorano al Progetto Utopia in 100.000.000.000.000 di CE? Avranno bisogno anche di sistemi informatici funzionali! L'uso di timestamp a 128 bit ci permetterebbe di identificarci in modo univoco in qualsiasi momento non solo da questa iterazione dell'universo, ma da molti, molti altri.
Blacklight Shining,

1
Dato che non hai mai accettato risposte prima su questo sito: se una delle risposte di seguito ti ha aiutato, non dimenticare di fare clic sul grigio a sinistra del suo testo, il che significa Sì, questa risposta è valida ! ;-)
Fabby,

Risposte:


34

Bene, se c'è un'opzione per comprare letteralmente un "bit", cioè trasferire da un intero a 32 bit con segno a un numero intero a 32 bit senza segno, le cose continuano a funzionare nel 2106.

Il trasferimento a 64 bit è "leggermente migliore". Ottieni centinaia di miliardi di anni di risoluzione.

E Ubuntu fa questo:

$ uname -p
x86_64

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

Tuttavia, questo è il livello del sistema operativo. Solo perché Ubuntu utilizza un numero intero a 64 bit per i suoi tempi non significa che MySQL / MariaDB lo userà per memorizzare i suoi timestamp. Se le date oltre il 2038 sono importanti per il tuo momento, inizia subito i test.

In realtà, posso farti risparmiare un po 'di tempo. È ancora rotto. Questo bug è stato segnalato oltre un decennio fa ma il suo test principale fallisce ancora con un int a 64 bit.

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

Questo non è nemmeno spazio di archiviazione. È leggermente patetico.

(E sì, è stato eseguito su MariaDB, versione 10.1)


8
10 anni fa, hanno ancora 22 anni per ripararlo. <Incrocia le dita> ...
Mindwin,

4
NB: L'uso di numeri interi a 32 bit senza segno è un hack .
Kevin,

6

Non memorizzarlo come intero. Memorizzalo come una stringa di data formattata ISO 8601 . Questo è il formato standard utilizzato su Internet.

9999-12-31T23:59:59+00:00

17
Alziamo tutti un bicchiere al bug Year10K! ;) Ma seriamente, mentre le stringhe sono davvero estendibili, sono relativamente enormi (il tuo esempio è 200 bit!) E analizzare e manipolare i numeri primitivi è un bazillion volte più veloce. Quello che conta.
Oli

6
Questo è un ottimo formato per la visualizzazione - e solo per quello. Per qualsiasi altra cosa (vale a dire, gestire i dati fino all'ultimo momento in cui si decide di formattarli per l'utente), come confrontare, fare aritmetica ecc. Il timestamp di Unix come numero intero (o float) è molto meglio.
egmont,

1
@Oli Importa, se in realtà conta. Questa soluzione non fallisce quando ci sono volte più vecchie dell'epoca UNIX. Il formato è lo standard utilizzato per le date su Internet, nei protocolli e nelle API. Se stai memorizzando qualcosa in una colonna MariaDB, allora davvero, è come dovresti memorizzarlo sul disco. Certo, in memoria, forse vuoi memorizzarlo in una struttura di dati più suscettibile. E non hai bisogno degli ultimi 40 bit se usi sempre UTC.
Dobey,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.