2011-02-02 6 views
10

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?

risposta

12

tm_mon è a base zero, quindi hai tentato di impostare il 31 febbraio, che è stato normalizzato. Ecco un collegamento alla definizione di mktime().

+2

In parole semplici, il 31 febbraio (che in realtà è il 3 marzo o il 2 marzo) è successivo al 1 marzo. – grep

+0

Grazie Jim - un po 'di duh momento;) Non sono sicuro di averlo perso dopo RTFM più volte! –

+0

@Paul - Abbiamo tutti quei momenti - ne ho avuto più di quello che vorrei ricordare :-) –

Problemi correlati