Как извлечь часы из time_t?

Я хочу извлечь часы, минуты и секунды как целочисленные значения из значения time_t, представляющего секунды с начала эпохи.

Значение для часов не является правильным. Зачем?

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

Выход (час должен быть 10)

06:15:35
10:15:35

06:15:36
10:15:36

06:15:37
10:15:37

2 ответа

Решение

Ваш звонок в gmtime() уже делает это, в результате чего struct tm имеет все поля. Смотрите документацию.

Другими словами, просто

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

Я бы сказал, что это правильный путь, поскольку он избегает использования слишком больших чисел для выполнения преобразования вручную в вашем коде. Он делает это наилучшим образом, превращая его в чью-то проблему (то есть абстрагируя ее). Так что исправьте ваш код, не добавляя недостающие 0, но с помощью gmtime(),

Также подумайте о часовых поясах.

int h = (t / 3600) % 24;  /* ### Your problem. */
Другие вопросы по тегам