图解:计算两个日期之间的天数

时间:2024-01-29 09:47:10
计算两个日期之间的天数的思路:

首先,判断输入的年份是不是闰年。年份是否相同?月份是否相同?日是否相同?

日月年有三种可能的情况:

  1. 同年同月。日数相减就出来了。
  2. 同年不同月。计算日期小的月份到年初的天数,计算日期大的月份到年初的天数。再把两个日期向减
  3. 不同年。先计算中间相隔几年,计算较小的日期到年底有多少天,再计算较大的日期距年初有多少天,将三个数向加。

代码如下:

 1 #include<iostream>
 2 #include<CString>
 3 #include<cmath>
 4 using namespace std;
 5 
 6 bool isleapyear(int year)   //判断是否是闰年
 7 {
 8     if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
 9         return 1;
10     else
11         return 0;
12 }
13 
14 int Days(int y, int m, int d)     //计算y年m月d日到y年1月1日的天数
15 {
16     int days[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
17     int i;
18     int sum = 0;         /* 计算天数 */
19     if (isleapyear(y))     /* 如果为闰年,2月有 29 天 */   
20         days[2] = 29;
21     for (i = 0; i<m; i++)
22         sum = sum + days[i];
23     sum = sum + d - 1;
24     return sum;
25 }
26 
27 int Days(int y1, int m1, int d1, int y2, int m2, int d2) //计算年月日都不相同的两个日期之间的天数
28 {
29     int t1;
30     int t2;
31     int year = y2-y1;
32     int sum=0;  //相差的天数
33     if (year == 1)      //如果两个日期的年份相差为1
34     {
35         t1 = Days(y1, 12, 31) - Days(y1, m1, d1);  //较小的日期计算y1年m1月d1日到年底的天数
36         t2 = Days(y2, m2, d2);                       //较大的日期计算y2年m2月d2日到年初的天数
37         sum = t1 + t2 + year;
38     }
39     else{
40         for (int i = y1+1; i < y2; i++)
41         {
42             if (isleapyear(i))
43             {
44                 sum += 366;
45             }
46             else
47                 sum += 365;
48         }
49         t1 = Days(y1, 12, 31) - Days(y1, m1, d1);
50         t2 = Days(y2, m2, d2);
51         sum = sum + t1 + t2 + 1;
52         
53     }
54     return sum;
55 }
56 
57 int main(){
58     int year1;   //较小的年份
59     int year2;
60     int month1;  //较小的月份
61     int month2;
62     int day1;
63     int day2;
64     int day=0;
65     cin >> year1 >> month1 >> day1;
66     cin >> year2 >> month2 >> day2;
67 
68     if (year1 > year2 || (year1 == year2) && (month1 > month2) || ((year1 == year2) && (month1 == month2)) && (day1 > day2) )
69     {
70         cout << "输入错误" << endl;
71     }
72     else{
73 
74         if (year1 == year2&&month1 == month2)    //  1.如果年和月相同,直接计算天数的差
75         {
76             day = abs(day2 - day1);
77             cout << day << endl;
78         }
79         else if (year1 == year2 && month1 != month2)   //  2.如果年份相同而月份不同,则计算较小的日期到较大的日期的天数
80         {
81             day = abs(Days(year1, month1, year1) - Days(year2, month2, day2));
82             cout << day << endl;
83         }
84         else
85         {
86             day = Days(year1, month1, day1, year2, month2, day2);
87             cout << day << endl;
88         }
89     }
90     return 0;
91     }

 


 

对于部分代码的理解:

int Days(int y, int m, int d)     //计算y年m月d日到y年1月1日的天数
{
    int days[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    int i;
    int sum = 0;         /* 计算天数 */
    if (isleapyear(y))     /* 如果为闰年,2月有 29 天 */   
        days[2] = 29;
    for (i = 0; i<m; i++)
        sum = sum + days[i];
    sum = sum + d - 1;
    return sum;
}

这个方法的功能是用来计算y年m月d日到y年1月1日的天数,如图。

另外这个方法还有另一个重要的用处——计算两个相邻年份之间的天数。

第一步,计算y1年m1月d1日到y1年12月31日的天数。

第二步,计算y2年m2月d2日到y2年1月1日的天数。

第三步,以上两个结果相加。

如图:

 


 

 

 1 for (int i = y1+1; i < y2; i++)
 2         {
 3             if (isleapyear(i))
 4             {
 5                 sum += 366;
 6             }
 7             else
 8                 sum += 365;
 9         }
10         t1 = Days(y1, 12, 31) - Days(y1, m1, d1);
11         t2 = Days(y2, m2, d2);
12         sum = sum + t1 + t2 + 1;

本段代码是在Days()方法的基础上增加了对两个年份之间间隔的天数的计算。

可以在理解Days()的基础上理解本段代码,图解如下: