2017-01-26 5 views
1

Je vais à travers des exercices de programmation avancée dans Unix et a rencontré la question suivante:calendrier temps stocké comme un entier signé 32 bits - quand sera-t déborder

Si le temps de calendrier est stocké comme signé 32 -bit entier, en quelle année débordera-t-il?

entier positif signé = 2147483647

Dans le calcul suivant, je ne suis pas la comptabilité pour 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 pile a été 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)); 
+0

Pour moi votre l'approche est correcte. –

+0

@MichaelWalz ce n'est pas exactement correct car il utilise 365 jours par an, en réalité le chiffre est de 365.242 ... –

+0

Vous supposez une époque particulière? Il y a l'époque unix standard, mais vous pouvez utiliser une autre époque si vous le souhaitez. –

Répondre

3

quand sera-t déborder

En supposant que sur la plate-forme en question int est de 32 bits de large (et time_t est un type intégral , diront que ce n'est pas un struct par exemple), il suffit de faire

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

et vous savez.

Il imprime:

Tue Jan 19 04:14:07 2038 

L'échange des arguments à difftime() on obtient la date "plus tôt" possible, BTW:

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

impressions

Fri Dec 13 21:45:53 1901 
3

Une façon serait d'utiliser la commande UNIX date. Plus précisément, date -d '@<seconds>' affichera la date et l'heure correspondant à <seconds> secondes depuis l'époque UNIX. De plus, vous pouvez fournir le spécificateur de format +%Y si vous vous souciez seulement de l'année.

Ainsi, pour cet exemple, vous exécuterez

date -d '@2147483647' +%Y 

et verriez la sortie 2038.

+0

L'époque est le 1er janvier 1970, donc si j'ajoute le résultat de mon calcul, la date de débordement serait 2038. – dcrearer

2

L'approche peut sembler naïve, mais presque exacte. Vous devez prendre en compte les années bissextiles et peut-être les secondes intercalaires.

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