temps de calendrier stocké en tant qu’entier signé de 32 bits – quand débordera-t-il

Je passe par des exercices de programmation avancée sous Unix et j’ai rencontré la question suivante:

Si l’heure du calendrier est stockée sous la forme d’un entier 32 bits signé, en quelle année va-t-il déborder?

entier signé positif = 2147483647

Dans le calcul suivant, je ne comptabilise pas les années bissextiles:

((((2147483647 / 60sec) /60min)/24)/365) = 68.1yrs 

C’est une approche naïve. Comment puis-je aborder cette question de manière professionnelle?

La solution suivante présentée précédemment par un membre de la stack était très utile pour imprimer l’année.

 int epoch_time = INT_MAX; struct tm * timeinfo; time_t epoch_time_as_time_t = epoch_time; timeinfo = localtime(&epoch_time_as_time_t); printf("2] overflow date: %s", asctime(timeinfo)); 

quand va-t-il déborder

En supposant que sur la plate-forme en question int soit large de 32 bits (et que time_t est un type intégral , dira que ce n’est pas une struct par exemple), faites simplement

 printf("%s\n", asctime(localtime(&(time_t){difftime(INT_MAX, 0)}))); 

et vous savez.

Il imprime:

 Tue Jan 19 04:14:07 2038 

En échangeant les arguments avec difftime() on obtient la date la plus ancienne possible, BTW:

 printf("%s\n", asctime(localtime(&(time_t){difftime(0, INT_MAX)}))); 

estampes

 Fri Dec 13 21:45:53 1901 

Un moyen serait d’utiliser la commande de date UNIX. Plus précisément, date -d '@' affichera la date et l’heure correspondant à secondes depuis l’époque UNIX. De plus, vous pouvez fournir le spécificateur de format +%Y si vous vous souciez de l’année.

Donc, pour cet exemple, vous exécuterez

 date -d '@2147483647' +%Y 

et verrait la sortie 2038 .

L’approche peut paraître naïve, mais elle est presque exacte. Vous devez prendre des années bissextiles et peut-être des secondes bissextiles en compte.

La page Wikipedia sur l’heure UNIX mentionne l’année 2038 quelque part. Là vous trouvez les détails restants.