如何利用time.h库计算输入日期的年内天数?
使用time.h计算输入日期在当年的天数
你的思路完全可行,借助C标准库的time.h可以轻松实现这个需求,核心是利用struct tm结构体和mktime()函数来完成日期转换与天数计算。
实现步骤
转换为
struct tm格式:tm_mon(月份)以0为起始(1月对应0),因此需要将输入的月份mm减1;tm_year(年份)是相对于1900的偏移量,因此输入的年份yy要减去1900;tm_mday直接赋值为输入的日期dd;- 将
tm_hour、tm_min、tm_sec设为0,排除时间部分的干扰; tm_isdst设为-1,让系统自动处理夏令时相关逻辑。
调用
mktime()函数:
该函数会将struct tm转换为time_t类型的时间戳,同时会自动修正结构体中的字段(比如处理闰年、月份天数等),执行后即可通过tm_yday字段获取天数信息。计算最终天数:
tm_yday存储的是该日期在当年的天数(从0开始计数,1月1日为0),因此最终结果需要加1。
修改后的完整代码
/* Uebung 2 - Aufgabe 1 */ #include <stdio.h> #include <time.h> int dd = 0; int mm = 0; int yy = 0; int main() { printf("Bitte geben Sie ein Datum in folgenden Format ein dd.mm.yyyy: "); scanf("%d.%d.%d", &dd, &mm, &yy); // 标记日期是否有效 int date_valid = 0; //check year if (yy>=1900 && yy<=9999) { //check month if(mm>=1 && mm<=12) { //check days if((dd>=1 && dd<=31) && (mm==1 || mm==3 || mm==5 || mm==7 || mm==8 || mm==10 || mm==12 )) date_valid = 1; else if((dd>=1 && dd<=30) && (mm==4 || mm==6 || mm==9 || mm==11)) date_valid = 1; else if((dd>=1 && dd<=28) && (mm==2)) date_valid = 1; else if(dd==29 && mm==2 && (yy%400==0 || (yy%4==0 && yy%100!=0))) date_valid = 1; else printf("Eingabe Tag falsch.\n"); } else { printf("Eingabe Monat falsch.\n"); } } else { printf("Eingabe Jahr falsch.\n"); } if (date_valid) { printf("Datum richtig!\n"); // 构建tm结构体 struct tm date_tm = {0}; date_tm.tm_mday = dd; date_tm.tm_mon = mm - 1; // 月份从0开始计数 date_tm.tm_year = yy - 1900; // 年份为1900年以来的偏移量 date_tm.tm_hour = 0; date_tm.tm_min = 0; date_tm.tm_sec = 0; date_tm.tm_isdst = -1; // 自动处理夏令时 // 调用mktime完成转换与修正 if (mktime(&date_tm) != (time_t)-1) { // tm_yday从0开始,加1得到实际天数 int day_of_year = date_tm.tm_yday + 1; printf("Das Datum ist der %d. Tag des Jahres.\n", day_of_year); } else { printf("Fehler bei der Berechnung des Tages im Jahr.\n"); } } printf("Folgendes Datum wurde eingelesen: %d.%d.%d\n", dd, mm, yy); return 0; }
关键说明
- 新增
date_valid变量统一标记日期有效性,避免重复代码; mktime()返回(time_t)-1表示转换失败,虽然已有输入验证,但保留该判断可应对极端异常情况;tm_yday是0起始的索引,必须加1才能得到从1开始的当年天数。
内容的提问来源于stack exchange,提问作者TheLuckyGuy
相关产品推荐
相关产品推荐

