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.