2011-02-02 6 views
10

Cuando llama a mktime(), el 1 de febrero parece llegar antes del 31 de enero. ¿Por qué es esto? ¿Estoy haciendo algo mal o es esto un error en glibc?Linux-x64 glibc: ¿Por qué el 1 de febrero viene antes del 31 de enero?

Aquí está el código:

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); 

Y aquí está la salida:

Time now 2011-2-3 11:41:28 (PST) = 61257325288 
Time now 2011-2-1 1:1:1 (PST) = 61257114061 

Tenga en cuenta que la intención original era comparar dos de time_t. Este problema hace que la primera fecha/hora aparezca más tarde que la segunda, lo que obviamente es un problema.

Esto se acaba de compilar con "gcc test.c" y ejecutar con "./a.out" en Ubuntu 9.10, gcc versión 4.4.1 (Ubuntu 4.4.1-4ubuntu8), libc-2.10.1-0ubuntu15

En un sistema de 32 bits, los resultados son los esperados, es decir, completamente diferentes al resultado de 64 bits.

¿Alguien quisiera confirmar/refutar este resultado y/o darme una idea de lo que puedo estar haciendo mal?

Respuesta

12

tm_mon tiene base cero, por lo que intentó configurar el 31 de febrero, que se normalizó. Aquí hay un enlace a la definición de mktime().

+2

Hablando en términos simples, el 31 de febrero (que es en realidad el 3 de marzo o el 2 de marzo) es posterior al 1 de marzo. – grep

+0

Gracias Jim - un momento duh;) ¡No estoy seguro de cómo me equivoqué después de RTFM varias veces! –

+0

@Paul - Todos tenemos esos momentos - He tenido más de lo que me importa recordar :-) –

Cuestiones relacionadas