Vous avez besoin :
typedef long long time64_t;
time64_t mktime64(struct tm *t);
struct tm* localtime64_r(const time64_t* t, struct tm* p);
A l'origine (en 2011) cette réponse contenait des liens vers 2038bug.com où il était possible de télécharger le petit pivotal_gmtime_r
bibliothèque, contenant les fonctions mentionnées. La bibliothèque a été supprimée de 2038bug.com à l'époque, les liens ont été rompus et ont été supprimés de la réponse par un modérateur. On dirait que pivotal_gmtime_r
code peut maintenant être trouvé ici :
https://github.com/franklin373/mortage/tree/master/time_pivotal
De plus, j'ai trouvé une autre bibliothèque plus récente, appelée y2038
, qui implémente également mktime64
et localtime64_r
:
https://github.com/evalEmpire/y2038
La fonction convertissant un struct tm*
à un time_t
est mktime
. Vous pouvez en trouver de nombreuses implémentations, par exemple. dans Glibc et dans mktime.c
de libvxc dossier. Vous pouvez prendre le code (en supposant qu'il soit légal pour vous, veuillez donc respecter les licences) et modifier time_t
à un entier de 64 bits comme int64_t
.
Les fonctions effectuant les autres conversions à partir de time_t
à struct tm*
sont localtime
ou gmtime
et vous pourriez faire de même.
Cependant, vous pourriez avoir un problème plus fondamental :votre machine 32 bits fonctionnant en 2040 devrait avoir un moyen de vous donner l'heure actuelle (comme le time
l'appel système le fait) de manière appropriée dans la variante 64 bits de time_t
, et c'est beaucoup plus difficile (cela dépend du noyau et du matériel).
Vous semblez faire l'hypothèse que time_t
est 32 bits sur les systèmes 32 bits, et cela peut être vrai ou non.
Sous Windows, à partir de Visual Studio 2005, la taille de time_t
est 64 bits, même lorsque vous compilez pour Windows 32 bits.
La partie malheureuse est que la glibc le définit comme long int
, qui sur les systèmes 32 bits est un entier 32 bits. Cela signifie que Linux 32 bits et d'autres plates-formes 32 bits basées sur gcc/glibc (comme Cygwin) ne pourront pas fonctionner avec des horodatages 64 bits.
Si votre application doit s'exécuter sur la glibc 32 bits, vous devez utiliser vos propres fonctions de conversion, qui peuvent être les mêmes fonctions dans la bibliothèque C recompilée pour utiliser des horodatages 64 bits.
Si vous avez besoin d'un code source avec une licence permissive (BSD), vous pouvez consulter ces fonctions dans minix3. Voici l'heure locale. La source est hyperliée, vous pouvez donc trouver les autres facilement.