1

我必须找到距离现在 4,000,000 秒的日期。如果我将 4,000,000 添加到 ,我可以得到正确的答案secondsSince1970,但我想知道为什么如果我添加 4,000,000 它不起作用now.tm_sec

int main(int argc, const char * argv[])
{
    long secondsSince1970 = time(NULL) + 4000000;

    struct tm now;

    localtime_r(&secondsSince1970, &now);

    printf("The date from 4,000,000 seconds from now is %i-%i-%i\n", now.tm_mon + 1, now.tm_wday, now.tm_year + 1900);
}

输出:日期是 10-1-2012


int main(int argc, const char * argv[])
{
    long secondsSince1970 = time(NULL);

    struct tm now;

    localtime_r(&secondsSince1970, &now);
    now.tm_sec += 4000000;

    printf("The date from 4,000,000 seconds from now is %i-%i-%i\n", now.tm_mon + 1, now.tm_wday, now.tm_year + 1900);
}

输出:日期是 8-4-2012

4

3 回答 3

5

struct tm只是一堆由localtime_r. 在调用 to 之后localtime_r,分配给这些变量之一不会神奇地使其他变量改变它们的值。

于 2012-08-16T16:10:25.853 回答
2

添加一个值tm_sec只是更改 的整数成员now。做你想做的最简单的方法是传递struct tmintomktime将其转换回time_t. 然后调用localtime_r结果值。

void
add_seconds(struct tm* broken, int num_seconds) {
   time_t then;
   broken->tm_sec += num_seconds;
   then = mktime(broken);
   localtime_r(&then, broken);
}

int
main(int argc, char const* argv[]) {
    time_t secondsSince1970 = time(NULL);
    struct tm now;
    localtime_r(&secondsSince1970, &now);
    add_seconds(&now, 4000000);
    printf("The date at 4,000,000 seconds from now is %i-%i-%i\n",
           now.tm_mon + 1, now.tm_mday, now.tm_year + 1900);
    return EXIT_SUCCESS;
}
于 2012-08-16T16:17:21.413 回答
0

这样做是不正确的:

now.tm_sec += 4000000;

您的 tm_sec 需要介于 0 和 59 之间(闰秒为 60)。

您需要执行以下操作:

now.tm_sec += 4000000;
now.tm_min += now.tm_sec / 60; now.tm_sec %= 60;
now.tm_hour += now.tm_min / 60; now.tm_min %= 60;
etc.
于 2012-08-16T16:10:47.663 回答