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.