Pregunta

I want to extract hours, minutes and seconds as integer values from a time_t value representing seconds since epoch.

The value for hours is not correct. Why?

#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);
    }
}

Output (the hour should be 10)

06:15:35
10:15:35

06:15:36
10:15:36

06:15:37
10:15:37
¿Fue útil?

Solución

Your call to gmtime() already does it, the resulting struct tm has all the fields. See the documentation.

In other words, just

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

I would argue that this is the proper way, since it avoids involving scarily large numbers to do the conversion manually in your code. It does so in the best of ways, by making it Someone Else's Problem (i.e., abstracting it away). So fix your code not by adding the missing 0, but by using gmtime().

Also think about timezones.

Otros consejos

int h = (t / 3600) % 24;  /* ### Your problem. */
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top