Necesitas:
typedef long long time64_t;
time64_t mktime64(struct tm *t);
struct tm* localtime64_r(const time64_t* t, struct tm* p);
Originalmente (en 2011) esta respuesta contenía enlaces a 2038bug.com donde era posible descargar el pequeño pivotal_gmtime_r
biblioteca, que contiene las funciones mencionadas. La biblioteca se eliminó de 2038bug.com en ese entonces, los enlaces se rompieron y un moderador los eliminó de la respuesta. Parece que pivotal_gmtime_r
el código ahora se puede encontrar aquí:
https://github.com/franklin373/mortage/tree/master/time_pivotal
Además, encontré otra biblioteca más reciente, llamada y2038
, que también implementa mktime64
y localtime64_r
:
https://github.com/evalEmpire/y2038
La función que convierte un struct tm*
a un time_t
es mktime
. Puede encontrar muchas implementaciones de la misma, por ejemplo. en Glibc y en mktime.c
de libvxc expediente. Puede tomar el código (suponiendo que sea legal para usted, así que respete las licencias) y cambie time_t
a un entero de 64 bits como int64_t
.
Las funciones que realizan las otras conversiones desde time_t
a struct tm*
son localtime
o gmtime
y tú podrías hacer lo mismo.
Sin embargo, es posible que tenga un problema más fundamental:su máquina de 32 bits que se ejecuta en el año 2040 debería tener alguna forma de darle la hora actual (como el time
la llamada del sistema lo hace) apropiadamente en la variante de 64 bits de time_t
, y eso es mucho más difícil (depende del kernel y del hardware).
Parece que estás suponiendo que time_t
es de 32 bits en sistemas de 32 bits, y esto puede o no ser cierto.
En Windows, comenzando con Visual Studio 2005 del tamaño de time_t
es de 64 bits, incluso cuando compila para Windows de 32 bits.
La parte desafortunada es que glibc lo define como long int
, que en los sistemas de 32 bits es un número entero de 32 bits. Eso significa que Linux de 32 bits y otras plataformas de 32 bits basadas en gcc/glibc (como Cygwin) no podrán funcionar con marcas de tiempo de 64 bits.
Si su aplicación debe ejecutarse en glibc de 32 bits, debe usar sus propias funciones de conversión, que podrían ser las mismas funciones en la biblioteca C recompiladas para usar marcas de tiempo de 64 bits.
Si necesita un código fuente con una licencia permisiva (BSD), puede ver estas funciones en minix3. Aquí está la hora local. La fuente tiene hipervínculos, por lo que puede encontrar los demás fácilmente.