C语言 为什么程序打印的第二天比正常少?

gdrx4gfi  于 2022-12-03  发布在  其他
关注(0)|答案(2)|浏览(162)
#include <stdio.h>
#include <time.h>

int main(){
    printf("%d\n", time(NULL));
    printf("Second: %ld\n", time(NULL)/60);
    printf("Minute: %ld\n", time(NULL)/(60*60));
    printf("Hour: %ld\n", time(NULL)/(60*60*60));
    printf("Day %ld\n", time(NULL)/(60*60*60*24));
    return 0;
}

今天是11月19日,是一年中的第323天。当我运行程序时,它打印出321。这是什么原因?

mrphzbgm

mrphzbgm1#

time(NULL)返回自1970年1月1日以来的秒数。
你的计算是错误的,因为你假设它们是从当前年份的开始,你除以秒一次太多。
令人惊讶的是,这两个错误几乎相互抵消,你最终得到的结果几乎是正确的,但并不完全正确。事实上,如果你在两年前(即1970年后的60年)运行这个程序,你会得到“正确”的结果。事实上,如果你在8年后(即1970年后的60年)运行这个程序,你会得到“正确”的答案。

cld4siwp

cld4siwp2#

因为你的日计算出错了。这里有一个正确的方法:

#include <stdio.h>
#include <time.h>

/* constants for time conversion
 * source: https://www.epochconverter.com/
Human-readable  time(Seconds)
1 Minute                      60
1 hour                     3,600
1 day                     86,400
1 week                   604,800
1 month (30.44 days)   2,629,743
1 year (365.24 days)  31,556,926
*/
int main(){
    // number of years since epoch
    // 00:00 January 1, 1970
    time_t t = time(NULL) % 31556926; /* number of seconds elapsed in this year */

    printf("Seconds: %ld\n", t);
    printf("Minute: %ld\n", t/60);
    printf("Hour: %ld\n", t/3600);
    printf("Day %ld\n",t/86400);
    return 0;
}

相关问题