图解:计算两个日期之间的天数
计算两个日期之间的天数的思路:
首先,判断输入的年份是不是闰年。年份是否相同?月份是否相同?日是否相同?
日月年有三种可能的情况:
- 同年同月。日数相减就出来了。
- 同年不同月。计算日期小的月份到年初的天数,计算日期大的月份到年初的天数。再把两个日期向减
- 不同年。先计算中间相隔几年,计算较小的日期到年底有多少天,再计算较大的日期距年初有多少天,将三个数向加。
代码如下:
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()的基础上理解本段代码,图解如下: