C语言中的时间函数?

C语言中的时间函数?,c,C,我必须在4000000秒后找到日期。如果我把4000000加到secondsSince1970,我可以得到正确的答案,但是我想知道为什么我把4000000加到now.tm_sec,它不起作用 输出: 日期为2012年1月10日 输出:日期是2012年8月4日您的struct tm只是一组由localtime填充的变量。调用localtime\u r后,分配给其中一个变量不会神奇地使其他变量更改其值。您的struct tm只是一组由localtime\r填充的变量。调用localtime\r后,分

我必须在4000000秒后找到日期。如果我把4000000加到secondsSince1970,我可以得到正确的答案,但是我想知道为什么我把4000000加到now.tm_sec,它不起作用

输出: 日期为2012年1月10日


输出:日期是2012年8月4日

您的struct tm只是一组由localtime填充的变量。调用localtime\u r后,分配给其中一个变量不会神奇地使其他变量更改其值。

您的struct tm只是一组由localtime\r填充的变量。调用localtime\r后,分配给其中一个变量不会神奇地使其他变量更改其值。

这样做是不正确的:

now.tm_sec += 4000000;
闰秒的tm_秒必须介于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.

这样做是不正确的:

now.tm_sec += 4000000;
闰秒的tm_秒必须介于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.
向tm_sec添加一个值只是更改now的整数成员。最简单的方法是将struct tm传递到,将其转换回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;
}
向tm_sec添加一个值只是更改now的整数成员。最简单的方法是将struct tm传递到,将其转换回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;
}

啊,好吧,它似乎在问同样的问题。啊,好吧,它似乎在问同样的问题。但是,一旦你到了月份和年份,就再也没有那么简单了,因为月份和年份有不同的长度,而且先验地说,你可以跳过任意数量的月份和年份。唯一合理的解决方案是转换回unix时间,然后做算术,最后再次转换成ymdhms。@HenningMakholm:因此我的等等:但一旦你转换到月份和年份,就再也没有那么简单了,因为月份和年份有不同的长度,而且事先你可以跳过任意数量的月份和年份。唯一明智的解决办法是转换回unix时间,然后做算术运算,最后再次转换成ymdhms。@HenningMakholm:因此我的等:如果这个问题很愚蠢,我很抱歉。我认为访问和分配结构变量成员的方法是声明结构变量名,后跟一个点,成员名,然后用=?@stumpped为其分配一个值:在这个代码示例中,您有指向结构的指针,而不是结构本身。所以原则上你会写*breake.tm_sec=。。。分配成员。但是,*abc.def结构非常常见,它在语言中有一个较短的缩写,即abc->def。谢谢您的回答!但是,我不明白当我没有在now前面使用*符号时,我是如何声明指向结构的指针的?您可以使用运算符的地址创建指向now的指针-&now是指向结构tm的指针。如果这个问题很愚蠢,我很抱歉。我认为访问和分配结构变量成员的方法是声明结构变量名,后跟一个点,成员名,然后用=?@stumpped为其分配一个值:在这个代码示例中,您有指向结构的指针,而不是结构本身。所以原则上你会写*breake.tm_sec=。。。分配成员。但是,*abc.def结构非常常见,它在语言中有一个较短的缩写,即abc->def。谢谢您的回答!但是,我不明白在now前面没有使用*符号的情况下,我是如何声明指向结构的指针的?您可以使用运算符的地址创建指向now的指针-&now是指向结构tm的指针。