D'autres ont noté que la date particulière que vous donnez comme exemple tombe au-delà de la date/heure maximale représentable par un time_t de 32 bits, souvent appelé le problème Year 2038. Une solution consiste à utiliser un time_t 64 bits, ce que font certains systèmes POSIX 64 bits (linux amd64), et appeler mktime
.
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
struct tm future; /* as in future date */
time_t t;
future.tm_sec = 0;
future.tm_min = 0;
future.tm_hour = 0;
future.tm_mday = 1; /* 1st */
future.tm_mon = 6; /* July */
future.tm_year = 2038 - 1900; /* 2038 in years since 1900 */
future.tm_isdst = 0; /* Daylight Saving not in affect (UTC) */
#ifdef _BSD_SOURCE
future.tm_zone = "UTC";
#endif
t = mktime(&future);
if (-1 == t) {
printf("Error converting 1 July 2038 to time_t time since Epoch\n");
return EXIT_FAILURE;
}
printf("UTC time and date: %s\n", asctime(&future));
return EXIT_SUCCESS;
}
Ce n'est pas une mauvaise question de programmation, si vous ignorez le spécifique, invalide en 32 bits, date donnée. Je pourrais diviser ceci en deux questions, ou réécrire le texte de la question pour mettre en évidence le problème 2038. – jmanning2k
Comme le type 'time_t' est défini par l'implémentation, seuls les systèmes 32 bits rencontrent un problème en 2038; la plupart des systèmes 64 bits ont déjà migré vers des valeurs 'time_t' de 64 bits, et vous aurez probablement besoin de vous inquiéter du soleil qui brûle avant que ça ne se répète. (Plus précisément: Solaris 10 - code 64 bits a 'sizeof (time_t) == 8' et le code 32 bits a' sizeof (time_t) == 4'.) –