La función localtime () muestra dos fechas iguales

¿Por qué cuando bash mostrar 2 fechas con diferentes argumentos, que pongo en la función localtime (), la consola muestra 2 fechas iguales?

Este es mi código:

#include #include #include int main() { time_t time1, time2; struct tm *timeinfo1, *timeinfo2; char *time1str, *time2str; time1 = 3600; time2 = 3720; timeinfo1 = localtime(&time1); timeinfo2 = localtime(&time2); time1str = asctime(timeinfo1); time2str = asctime(timeinfo2); puts(time1str); puts(time2str); getch(); return 0; } 

Los datos no persistirían entre dos llamadas a asctime o asctime . Tienes que copiar datos en alguna parte. Aquí está el ejemplo corregido (todavía tengo un pequeño problema con strncpy):

 #include  #include  #include  int main() { time_t time1, time2; struct tm timeinfo1, timeinfo2, *ti; char time1str[256], time2str[256], *tstr; time1 = 3600; time2 = 3720; ti = localtime(&time1); memcpy(&timeinfo1, ti, sizeof(*ti)); ti = localtime(&time2); memcpy(&timeinfo2, ti, sizeof(*ti)); tstr = asctime(&timeinfo1); strncpy(time1str, tstr, sizeof(time1str) - 1); tstr = asctime(&timeinfo2); strncpy(time2str, tstr, sizeof(time1str) - 1); puts(time1str); puts(time2str); return 0; } 

Desde el doc. De hora local :

El valor devuelto apunta a un objeto interno cuya validez o valor puede ser alterado por cualquier llamada subsiguiente a gmtime o localtime.

localtime() devuelve dos veces el mismo puntero: está trabajando dos veces en los mismos datos.

Prueba:

 printf("%p\n", localtime(&time1)); printf("%p\n", localtime(&time2)); 

Salida:

 0x7f7d9d2eee80 0x7f7d9d2eee80 

localtime() y asctime() devuelven un puntero a un búfer interno. Este búfer se sobrescribe cada vez que se llama asctime() localtime() o asctime() , por lo que en el código del OP el resultado de la primera llamada se reemplaza por el resultado de la segunda llamada.

Para imprimir los diferentes tiempos, simplemente reorganice el orden de las llamadas de esta manera:

 timeinfo1 = localtime(&time1); time1str = asctime(timeinfo1); puts(time1str); timeinfo2 = localtime(&time2); time2str = asctime(timeinfo2); puts(time2str); 

Alternativamente, si utiliza un sistema compatible con POSIX, use localtime_r() y asctime_r() que usan un búfer proporcionado por el llamante:

 #define _POSIX_C_SOURCE 1 #include #include #include int main(void) { time_t time1 = 3600; time_t time2 = 3720; struct tm timeinfo1 = {0}; struct tm timeinfo2 = {0}; char time1str[32] = ""; char time2str[32] = ""; localtime_r(&time1, &timeinfo1); localtime_r(&time2, &timeinfo2); asctime_r(&timeinfo1, timestr1); asctime_r(&timeinfo2, timestr2); puts(time1str); puts(time2str); getch(); return 0; } 

Tenga en cuenta la diferente statement de los vàriables timeinfo? y el time?str .

¿Por qué … consola muestra 2 fechas iguales?

localtime() y gmtime() devuelven un puntero a una ubicación de memoria de struct tm compartida.

Al igual que la respuesta correcta de @keltar , para retener la información de struct tm , el código debe copiar esa struct tm antes de una posterior llamada localtime(), gmtime() .

En lugar de mempcy() una tarea simple = hará.

 // struct tm *timeinfo1, *timeinfo2; // Not pointers struct tm timeinfo1, timeinfo2; // ... but structures. time1 = 3600; time2 = 3720; // timeinfo1 = localtime(&time1); // Rather than copy the pointer // timeinfo2 = localtime(&time2); // v--------------------- // Notice the * timeinfo1 = *localtime(&time1); // Copy the structure timeinfo2 = *localtime(&time2);