Linux-X64 GLIBC: ¿Por qué viene el 1 de febrero antes del 31 de enero?
Pregunta
Cuando llamas a mktime (), el 1 de febrero parece venir antes del 31 de enero. ¿Por qué es esto? ¿Estoy haciendo algo mal o es un error en GLIBC?
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 Time_T's. Este problema hace que la primera fecha/hora parezca más tarde que la segunda, lo que obviamente es un problema.
Esto se compila con "GCC Test.c" y se ejecuta 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!
¿A alguien le importaría confirmar/refutar este resultado y/o dar una idea de lo que puedo estar haciendo mal?
Solución
TM_MON está basado en cero, por lo que intentó establecer el 31 de febrero, lo que se normalizó. Aquí hay un enlace a la definición de mktime ().