C++ 盘算日期差

打印 上一主题 下一主题

主题 1028|帖子 1028|积分 3084


 
  1. #include <iostream>
  2. using namespace std;
  3. //定义日期结构体,用于存放年、月、日这三个日期相关的信息
  4. struct Date
  5. {
  6.     int year;
  7.     int month;
  8.     int day;
  9. };
  10. int main()
  11. {
  12.     Date d1, d2;
  13.     //从标准输入(控制台)读取第一个日期的年、月、日信息
  14.     cin >> d1.year >> d1.month >> d1.day;
  15.     //从标准输入(控制台)读取第二个日期的年、月、日信息
  16.     cin >> d2.year >> d2.month >> d2.day;
  17.     int days = 0;  //用于记录两个日期之间相差的天数,初始化为0
  18. //判断第一个日期的年份是否小于第二个日期的年份,如果小于,则先按年逐步推进第一个日期到下一年
  19.     if (d1.year < d2.year)
  20.     {
  21.         //当月份还没到12月时(即当前年还没结束),进行以下循环操作
  22.         while (d1.month < 12)
  23.         {
  24.             d1.day++;  //日期天数加1,表示日子往后推一天
  25.             days++;    //相差天数也加1,因为每过一天,两个日期之间的天数差就多一天
  26.             //根据当前月份进行不同的日期边界判断和日期、月份的更新操作
  27.             switch (d1.month)
  28.             {
  29.             // 处理大月(31天的月份)的情况
  30.             case 1: case 3: case 5:
  31.             case 7: case 8: case 10:
  32.             case 12:
  33.                 //如果当前日期的天数超过了31天,说明进入下一个月了
  34.                 if (d1.day > 31)
  35.                 {
  36.                     d1.month++;  // 月份加1,进入下一个月
  37.                     d1.day = 1;  // 日期重置为1号
  38.                 }
  39.                 break;
  40.             //处理2月的情况,要考虑闰年和平年不同的天数情况
  41.             case 2:
  42.                 //判断是否为闰年(能被4整除但不能被100整除,或者能被400整除就是闰年)
  43.                 if (d1.year / 4 == 0 && d1.year % 100!= 0
  44.                     || d1.year % 400 == 0)
  45.                 {
  46.                     //如果是闰年且当前日期天数超过29天,进入下一个月
  47.                     if (d1.day > 29)
  48.                     {
  49.                         d1.month++;
  50.                         d1.day = 1;
  51.                     }
  52.                 }
  53.                 else
  54.                 {
  55.                     //如果是平年且当前日期天数超过28天,进入下一个月
  56.                     if (d1.day > 28)
  57.                     {
  58.                         d1.month++;
  59.                         d1.day = 1;
  60.                     }
  61.                 }
  62.                 break;
  63.             //处理小月(30天的月份)的情况
  64.             default:
  65.                 if (d1.day > 30)
  66.                 {
  67.                     d1.month++;
  68.                     d1.day = 1;
  69.                 }
  70.                 break;
  71.             }
  72.         }
  73.         //当前年结束后,年份加1,进入下一年,月份重置为1月
  74.         d1.year++;
  75.         d1.month = 1;
  76.         //加上一整年
  77. //(按平年365天算,这里先简单加31天表示过渡到下一年年初,后续月份推进还会继续准确计算天数)
  78.         days += 31;
  79.     }
  80.     //当第一个日期的月份小于第二个日期的月份时,进行以下循环操作,按月份逐步推进第一个日期
  81.     while (d1.month < d2.month)
  82.     {
  83.         d1.day++;  //日期天数加1,表示日子往后推一天
  84.         days++;    //相差天数也加1,因为每过一天,两个日期之间的天数差就多一天
  85.     //根据当前月份进行不同的日期边界判断和日期、月份的更新操作,和前面判断年份时的逻辑类似
  86.         switch (d1.month)
  87.         {
  88.         case 1: case 3: case 5:
  89.         case 7: case 8: case 10:
  90.         case 12:
  91.             if (d1.day > 31)
  92.             {
  93.                 d1.month++;
  94.                 d1.day = 1;
  95.             }
  96.             break;
  97.         case 2:
  98.             if (d1.year / 4 == 0 && d1.year % 100!= 0
  99.                 || d1.year % 400 == 0)
  100.             {
  101.                 if (d1.day > 29)
  102.                 {
  103.                     d1.month++;
  104.                     d1.day = 1;
  105.                 }
  106.             }
  107.             else
  108.             {
  109.                 if (d1.day > 28)
  110.                 {
  111.                     d1.month++;
  112.                     d1.day = 1;
  113.                 }
  114.             }
  115.             break;
  116.         default:
  117.             if (d1.day > 30)
  118.             {
  119.                 d1.month++;
  120.                 d1.day = 1;
  121.             }
  122.             break;
  123.         }
  124.     }
  125.     //当第一个日期的天数小于第二个日期的天数时,进行以下循环操作
  126.     //按天逐步推进第一个日期,直到天数相等
  127.     while (d1.day < d2.day)
  128.     {
  129.         d1.day++;  //日期天数加1,表示日子往后推一天
  130.         days++;    //相差天数也加1,因为每过一天,两个日期之间的天数差就多一天
  131.     }
  132.     //将计算得到的两个日期之间相差的天数输出到控制台
  133.     cout << days;
  134.     return 0;
  135. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

南飓风

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表