GNU/Linux >> Tutoriels Linux >  >> Linux

Conversion d'horodatage Unix 64 bits

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.


Linux
  1. Comment ajouter un horodatage à la sortie de la commande Unix Vmstat

  2. Existe-t-il un moyen d'obtenir time_t 64 bits dans des programmes 32 bits sous Linux ?

  3. Comment déterminer le bitness du matériel et du système d'exploitation ?

  4. Mode opérationnel CPU 32 bits, 64 bits sous Linux

  5. Exécutez une application 64 bits sur un système Ubuntu 32 bits

Votre Ubuntu est-il un système d'exploitation 32 bits ou 64 bits ?

Votre Ubuntu est-il un système d'exploitation 32 bits ou 64 bits ? [IHM + Terminal]

Linux contre Unix

Comment savoir si la version 32 bits ou 64 bits de Linux

Comment vérifier que le système Linux est 32 bits ou 64 bits ?

vérifier quels packages 32 bits sont installés sur un serveur 64 bits