Funciones para obtener fecha y hora local

Iniciado por terrateck, 25 Diciembre 2013, 21:36 PM

0 Miembros y 1 Visitante están viendo este tema.

terrateck

Hola a todos,

Estoy teniendo problemas con las funciones time y localtime para obtener la hora local. En el siguiente ejemplo que muestro intento obtener dos fechas diferentes con un delay de 5 seg entre ellas, usando variables independientes.
Antes de obtener la segunda fecha imprimo también en pantalla la primera para la comprobación.

Código (cpp) [Seleccionar]
#include <stdio.h>
#include <time.h>
#include <windows.h>

#define TFECHA 30

int main ()
 {
 time_t t1,t2;
 struct tm *tinfo1, *tinfo2;
 char f1[TFECHA],f2[TFECHA];

 time(&t1);
 tinfo1=localtime(&t1);
 strftime(f1, TFECHA, "%d/%m/%Y %H:%M:%S", tinfo1);
 printf("%s\n", f1);

 Sleep(5000);

 time(&t2);
 tinfo2=localtime(&t2);

 strftime(f1, TFECHA, "%d/%m/%Y %H:%M:%S", tinfo1);
 strftime(f2, TFECHA, "%d/%m/%Y %H:%M:%S", tinfo2);
 printf("%s\n%s", f1,f2);

 return 0;
 }



Sin embargo al imprimir al final las dos últimas fechas, los valores que se obtienen son exactamente iguales. No entiendo por qué al ejecutar tinfo2=localtime(&t2) la estructura t1 también se ve alterada...

Salida generada:

25/12/2013 15:38:34
25/12/2013 15:38:39
25/12/2013 15:38:39


Si alguien pudiera aclarármelo se lo agradecería.

Saludos.

rir3760

Cita de: terrateck en 25 Diciembre 2013, 21:36 PMSin embargo al imprimir al final las dos últimas fechas, los valores que se obtienen son exactamente iguales. No entiendo por qué al ejecutar tinfo2=localtime(&t2) la estructura t1 también se ve alterada
Es un error lógico. El problema no son las variables t1 y t2 sino tinfo1 y tinfo2.

La documentación de la función "localtime" es:
Citarlocaltime

struct tm *localtime(const time_t *tod);

The function stores in the static-duration time structure an encoding of the calendar time in *tod, expressed as local time. It returns the address of that structure.
Ella retorna la dirección de un objeto interno con clase de almacenamiento estático, esto es, se crea justo antes de llamarse a la función main y se destruye al finalizar el programa, por eso la dirección que retorna en cada llamada es la misma. Puedes comprobarlo imprimiendo la dirección de esos dos punteros justo antes de terminar tu programa.

Para que tenga el comportamiento que indicas debes evitar el uso de punteros, de esta forma:
#include <stdio.h>
#include <time.h>

#include <windows.h>

#define TFECHA 30

int main(void)
{
   time_t t1, t2;
   struct tm tinfo1, tinfo2;
   char f1[TFECHA],f2[TFECHA];
   
   time(&t1);
   tinfo1 = *localtime(&t1);
   strftime(f1, TFECHA, "%d/%m/%Y %H:%M:%S", &tinfo1);
   printf("%s\n", f1);
   
   Sleep(5000);
   
   time(&t2);
   tinfo2 = *localtime(&t2);
   strftime(f1, TFECHA, "%d/%m/%Y %H:%M:%S", &tinfo1);
   strftime(f2, TFECHA, "%d/%m/%Y %H:%M:%S", &tinfo2);
   printf("%s\n%s\n", f1,f2);
   
   return 0;
}


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

terrateck

Gracias rir3760 por la aclaración conceptual y por la corrección. Me ha servido para solucionar el problema.

Parece que el usuario dayu34 está haciendo spam.

Saludos