2012-06-28 12 views
6

Quiero extraer horas, minutos y segundos como valores enteros de un valor time_t que representa segundos desde epoch.¿Cómo extraer horas de time_t?

El valor de las horas no es correcto. ¿Por qué?

#include <stdio.h> 
#include <time.h> 

#include <unistd.h> 

int main() 
{ 
    char buf[64]; 

    while (1) { 
     time_t t = time(NULL); 
     struct tm *tmp = gmtime(&t); 

     int h = (t/360) % 24; /* ### My problem. */ 
     int m = (t/60) % 60; 
     int s = t % 60; 

     printf("%02d:%02d:%02d\n", h, m, s); 

     /* For reference, extracts the correct values. */ 
     strftime(buf, sizeof(buf), "%H:%M:%S\n", tmp); 
     puts(buf); 
     sleep(1); 
    } 
} 

de salida (la hora debe ser 10)

06:15:35 
10:15:35 

06:15:36 
10:15:36 

06:15:37 
10:15:37 
+0

"int h = (t/3600)% 24; ..." hace que _assumption_ el 'time_t' esté en enteros segundos. Aunque eso es común, C no lo define como tal. Use 'gmtime()/localtime()' o 'difftime()' para el código portable. – chux

Respuesta

5

Su llamada a gmtime() ya lo hace, el struct tm resultante tiene todos los campos. Ver the documentation.

En otras palabras, sólo

printf("hours is %d\n", tmp->tm_hour); 

Yo diría que esta es la forma correcta, ya que evita que implica aterradoramente grandes números para hacer la conversión manualmente en su código. Lo hace de la mejor manera, convirtiéndolo en el problema de otra persona (es decir, abstrayéndolo). Así que arregle su código no agregando el 0 que falta, sino usando gmtime().

También piense en zonas horarias.

+0

Gracias, pero la pregunta era: ¿Por qué el cálculo no es correcto? (Estoy de acuerdo en que el uso de struct tm es un mejor enfoque, sin embargo). –

+2

@dannas: Porque estás dividiendo como: t/360 donde debería ser t/3600 (recuerda 60 * 60) – Abhineet

+0

Hm, la pregunta en realidad fue: "cómo extraer horas de time_t" (en la especificación del problema agregué el otro pregunta). Aceptando la respuesta, ya que da una buena razón de por qué debería evitar hacer la conversión yo mismo. –

11
int h = (t/3600) % 24; /* ### Your problem. */ 
+0

Doh, ¿por qué no vi ese obvio? –

+0

Creo que todos a veces miran un error y no lo ven. A menudo es para mí;) –

Cuestiones relacionadas