为何程序计算的本年天数比实际少2天?
问题分析:计算本年天数出现偏差的原因
今日为11月19日,是本年的第323天,但运行以下C语言程序时,输出的“本年天数”为321天,问题根源如下:
原代码
#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; }
问题原因
- 核心概念错误:
time(NULL)返回的是从1970年1月1日00:00:00 UTC到当前时间的总秒数,直接用这个值除以一天的秒数(86400),得到的是从1970年到现在的总天数,完全不是本年已过的天数,这就是数值偏差的本质原因。 - 次要问题:多次调用
time(NULL)可能导致结果不一致——如果程序运行时跨了秒,每次调用返回的秒数会不同,但这不是本次天数偏差的主要因素。
正确实现方式
要获取本年已过的天数,需要将时间戳转换为包含日期信息的tm结构体,提取其中的tm_yday字段(该字段从0开始计数,所以实际天数要加1):
#include <stdio.h> #include <time.h> int main(){ time_t now = time(NULL); struct tm *local_date = localtime(&now); // tm_yday表示当年第0天到第364/365天,加1得到实际天数 printf("本年第%d天\n", local_date->tm_yday + 1); return 0; }
内容的提问来源于stack exchange,提问作者Ozan Bağıran
相关产品推荐
相关产品推荐

