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?
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
Gracias Jim - un momento duh;) ¡No estoy seguro de cómo me equivoqué después de RTFM varias veces! –
@Paul - Todos tenemos esos momentos - He tenido más de lo que me importa recordar :-) –