8

我想从表示自纪元以来的秒数的 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
4

2 回答 2

14
int h = (t / 3600) % 24;  /* ### Your problem. */
于 2012-06-28T10:31:14.913 回答
7

您的调用gmtime()已经完成,结果struct tm包含所有字段。请参阅文档

换句话说,只是

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

我认为这是正确的方法,因为它避免了在代码中手动进行转换的大量数字。它以最好的方式做到这一点,通过使其成为别人的问题(即,将其抽象出来)。所以修复你的代码不是通过添加缺失的0,而是通过使用gmtime().

还要考虑时区。

于 2012-06-28T10:29:45.390 回答