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

转载于:https://www.cnblogs.com/rever/p/4435682.html
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
