J'ai cherché dans la boîte linux et j'ai vu qu'il était typedef pour
typedef __time_t time_t;
Mais je n'ai pas trouvé la définition de __time_t.
J'ai cherché dans la boîte linux et j'ai vu qu'il était typedef pour
typedef __time_t time_t;
Mais je n'ai pas trouvé la définition de __time_t.
El time_t Article Wikipedia Cet article apporte un éclairage sur ce sujet. L'essentiel est que le type de time_t
n'est pas garanti dans la spécification C.
El
time_t
Le type de données est un type de données dans la bibliothèque C de l'ISO, défini pour le stockage valeurs de temps système. Ces valeurs sont renvoyées par la normetime()
fonction de bibliothèque. Ce type est un typedef défini dans l'en-tête standard en-tête. L'ISO C définit time_t comme un type arithmétique, mais elle ne ne spécifie pas de type particulier , l'étendue, la résolution ou l'encodage. Sont également non spécifiées les significations des opérations arithmétiques appliquées aux valeurs valeurs du temps.Les systèmes Unix et les systèmes compatibles POSIX mettent en œuvre la fonction
time_t
comme unsigned integer
(généralement d'une largeur de 32 ou 64 bits) qui représente le nombre de secondes depuis le début de l'époque Unix : minuit UTC du 1er janvier 1970 (sans compter les secondes pas les secondes intercalaires). Certains systèmes gèrent correctement les valeurs de temps négatives alors que d'autres ne le font pas. Les systèmes utilisant un système 32 bitstime_t
sont sensibles à le site Problème de l'année 2038 .
[root]# cat time.c
#include <time.h>
int main(int argc, char** argv)
{
time_t test;
return 0;
}
[root]# gcc -E time.c | grep __time_t
typedef long int __time_t;
Il est défini dans $INCDIR/bits/types.h
à travers :
# 131 "/usr/include/bits/types.h" 3 4
# 1 "/usr/include/bits/typesizes.h" 1 3 4
# 132 "/usr/include/bits/types.h" 2 3 4
La réponse est certainement spécifique à l'implémentation. Pour connaître la réponse définitive pour votre plateforme/compilateur, ajoutez simplement cette sortie quelque part dans votre code :
printf ("sizeof time_t is: %d\n", sizeof(time_t));
Si la réponse est 4 (32 bits) et que vos données sont destinées à dépasser 2038 alors vous avez 25 ans pour migrer votre code.
Vos données seront parfaites si vous les stockez sous forme de chaîne, même si c'est quelque chose de simple comme :
FILE *stream = [stream file pointer that you've opened correctly];
fprintf (stream, "%d\n", (int)time_t);
Ensuite, il suffit de le relire de la même manière (fread, fscanf, etc. dans un int), et vous avez votre temps de décalage d'époque. Une solution de contournement similaire existe en .Net. Je fais passer des numéros d'époque 64 bits entre des systèmes Win et Linux sans problème (sur un canal de communication). Cela soulève des problèmes d'ordonnancement des octets, mais c'est un autre sujet.
Pour répondre à la question de paxdiablo, je dirais qu'il a imprimé "19100" parce que le programme a été écrit de cette façon (et j'admets avoir fait cela moi-même dans les années 80) :
time_t now;
struct tm local_date_time;
now = time(NULL);
// convert, then copy internal object to our object
memcpy (&local_date_time, localtime(&now), sizeof(local_date_time));
printf ("Year is: 19%02d\n", local_date_time.tm_year);
El printf
imprime la chaîne fixe "Année : 19" suivie d'une chaîne de caractères remplie de zéros contenant les "années depuis 1900" (définition de l'instruction tm->tm_year
). En 2000, cette valeur est de 100, évidemment. "%02d"
tamponne avec deux zéros mais ne tronque pas si la longueur est supérieure à deux chiffres.
La méthode correcte est (modification de la dernière ligne uniquement) :
printf ("Year is: %d\n", local_date_time.tm_year + 1900);
Nouvelle question : Quelle est la raison de ce raisonnement ?
C'est un type d'entier signé 32 bits sur la plupart des anciennes plateformes. Cependant, cela fait en sorte que votre code souffre de la bug de l'année 2038 . Les bibliothèques C modernes devraient donc le définir comme un int 64 bits signé, ce qui est sûr pour quelques milliards d'années.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.