Frage

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
War es hilfreich?

Lösung

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.

Andere Tipps

int h = (t / 3600) % 24;  /* ### Your problem. */
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top