You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何利用time.h库计算输入日期的年内天数?

使用time.h计算输入日期在当年的天数

你的思路完全可行,借助C标准库的time.h可以轻松实现这个需求,核心是利用struct tm结构体和mktime()函数来完成日期转换与天数计算。

实现步骤

  1. 转换为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,让系统自动处理夏令时相关逻辑。
  2. 调用mktime()函数:
    该函数会将struct tm转换为time_t类型的时间戳,同时会自动修正结构体中的字段(比如处理闰年、月份天数等),执行后即可通过tm_yday字段获取天数信息。

  3. 计算最终天数:
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 09:57:18