Quando chiami mktime(), il 1 febbraio sembra venire prima del 31 gennaio. Perché è questo? Sto facendo qualcosa di sbagliato o si tratta di un bug in glibc?Linux-x64 glibc: Perché il primo febbraio arriva prima del 31 gennaio?
Ecco il codice:
struct tm tm;
time_t tt;
memset(&tm, 0, sizeof(tm));
tm.tm_year = 2011;
tm.tm_mon = 1;
tm.tm_mday = 31;
tm.tm_hour = 11;
tm.tm_min = 41;
tm.tm_sec = 28;
tm.tm_isdst = 0;
tt = mktime(&tm);
printf("Time now %d-%d-%d %d:%d:%d (%s) = %lu\n",
tm.tm_year, tm.tm_mon, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, tm.tm_zone, tt);
memset(&tm, 0, sizeof(tm));
tm.tm_year = 2011;
tm.tm_mon = 2;
tm.tm_mday = 1;
tm.tm_hour = 1;
tm.tm_min = 1;
tm.tm_sec = 1;
tm.tm_isdst = 0;
tt = mktime(&tm);
printf("Time now %d-%d-%d %d:%d:%d (%s) = %lu\n",
tm.tm_year, tm.tm_mon, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, tm.tm_zone, tt);
Ed ecco l'output:
Time now 2011-2-3 11:41:28 (PST) = 61257325288
Time now 2011-2-1 1:1:1 (PST) = 61257114061
Nota che l'intenzione originale era quella di confrontare due time_t di. Questo problema fa apparire la prima data/ora al secondo, il che ovviamente è un po 'un problema.
Questo è solo compilato con "gcc test.c" ed eseguito con "./a.out" su Ubuntu 9.10, gcc versione 4.4.1 (Ubuntu 4.4.1-4ubuntu8), libc-2.10.1-0ubuntu15
Su un sistema a 32 bit, i risultati sono come previsto, ovvero completamente diversi dal risultato a 64 bit!
Qualcuno si preoccuperebbe di confermare/confutare questo risultato e/o dare qualche idea su cosa potrei fare male?
In parole semplici, il 31 febbraio (che in realtà è il 3 marzo o il 2 marzo) è successivo al 1 marzo. – grep
Grazie Jim - un po 'di duh momento;) Non sono sicuro di averlo perso dopo RTFM più volte! –
@Paul - Abbiamo tutti quei momenti - ne ho avuto più di quello che vorrei ricordare :-) –