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?

¿Fue útil?

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 ().

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top