GNU/Linux >> Linux Esercitazione >  >> Linux

Conversione timestamp Unix a 64 bit

Hai bisogno di:

typedef long long time64_t; 
time64_t mktime64(struct tm *t); 
struct tm* localtime64_r(const time64_t* t, struct tm* p);

Originariamente (nel 2011) questa risposta conteneva link a 2038bug.com dove era possibile scaricare il piccolo pivotal_gmtime_r libreria, contenente le funzioni citate. La libreria è stata rimossa da 2038bug.com allora, i collegamenti si sono interrotti e sono stati rimossi dalla risposta da un moderatore. Sembra quel pivotal_gmtime_r il codice può ora essere trovato qui:

https://github.com/franklin373/mortage/tree/master/time_pivotal

Inoltre, ho trovato un'altra libreria più recente, chiamata y2038 , che implementa anche mktime64 e localtime64_r :

https://github.com/evalEmpire/y2038


La funzione che converte un struct tm* a un time_t è mktime . Puoi trovarne molte implementazioni, ad es. in Glibc e in mktime.c di libvxc file. Potresti prendere il codice (supponendo che sia legale per te, quindi per favore rispetta le licenze) e cambia time_t a qualche numero intero a 64 bit come int64_t .

Le funzioni che eseguono le altre conversioni da time_t a struct tm* sono localtime o gmtime e potresti fare lo stesso.

Tuttavia, potresti avere un problema più fondamentale:la tua macchina a 32 bit in esecuzione nell'anno 2040 dovrebbe avere un modo per darti l'ora corrente (come time system call lo fa) in modo appropriato nella variante a 64 bit di time_t , e questo è molto più difficile (dipende dal kernel e dall'hardware).


Sembra che tu stia supponendo che time_t è a 32 bit su sistemi a 32 bit, e questo può o non può essere vero.

Su Windows, a partire da Visual Studio 2005 la dimensione di time_t è a 64 bit, anche quando compili per Windows a 32 bit.

La parte sfortunata è che glibc lo definisce come long int , che nei sistemi a 32 bit è un numero intero a 32 bit. Ciò significa che Linux a 32 bit e altre piattaforme a 32 bit basate su gcc/glibc (come Cygwin) non saranno in grado di funzionare con timestamp a 64 bit.

Se la tua applicazione deve essere eseguita su glibc a 32 bit, dovresti utilizzare le tue funzioni di conversione, che potrebbero essere le stesse funzioni nella libreria C ricompilate per utilizzare timestamp a 64 bit.

Se hai bisogno di un codice sorgente con una licenza permissiva (BSD), puoi guardare queste funzioni in minix3. Ecco l'ora locale. La fonte è un collegamento ipertestuale, quindi puoi trovare facilmente gli altri.


Linux
  1. Mac Os X Unix?

  2. Spazio degli indirizzi del processo a 32 bit su Linux a 64 bit

  3. Esiste un modo per ottenere time_t a 64 bit nei programmi a 32 bit in Linux?

  4. Installare Ubuntu a 64 bit o 32 bit?

  5. Trovare librerie a 32 bit su Linux a 64 bit

Il tuo Ubuntu è un sistema operativo a 32 o 64 bit?

Il tuo Ubuntu è un sistema operativo a 32 o 64 bit? [GUI + Terminale]

Linux vs Unix

Come sapere se la versione a 32 bit o 64 bit di Linux

Come verificare il sistema Linux è a 32 o 64 bit?

controlla quali pacchetti a 32 bit sono installati su un server a 64 bit