目录
计算两个日期中间的天数计算逻辑处理闰年以及年月天数情况处理正常逻辑年月一致年一致,月不一致年月都不一致
代码实现
计算两个日期中间的天数
日常刷题碰到的,有计算两个日期之间天数的,有计算两个日期工作日数目的。这一类题目逻辑上算不上太难。只是没碰到过的话,第一时间可能想不好怎么处理。这里贴出来一条计算方法。
计算逻辑
打个比方是2020.3.15-2020.5.5中间一共多少天? 首先是处理闰年,这是死方法,处理天数也是。
处理闰年以及年月天数情况
以下数组第一维用来判断是否是闰年
int monthdays
[2][12] = { { 31,28,31,30,31,30,31,31,30,31,30,31 },{ 31,29,31,30,31,30,31,31,30,31,30,31 } };
int yeardays
[2] = { 365,366 };
int isLearyear(int year
)
{
if (year
% 4 == 0 && year
% 100 != 0 || year
% 400 == 0)
return 1;
else
return 0;
}
处理正常逻辑
年月一致
直接计算天数差别
if (year1
== year2
&& month1
== month2
)
{
sumdays
= day2
- day1
;
}
年一致,月不一致
比如3月5日到5月15日,我们可以先计算3月还剩余天数,然后计算其中整个的月的天数,再加上最后一个5月的15天。
if (year1
== year2
)
{
sumdays
+= monthdays
[isLearyear(year1
)][month1
-1] - day1
;
for (int i
= month1
; i
< month2
-1; i
++)
{
sumdays
+= monthdays
[isLearyear(year1
)][i
];
}
sumdays
+= day2
;
}
年月都不一致
首先处理第一个日期当月到年底的整月的天数计算两个日期中间整年天数再加上第二个日期最后的整月的天数最后加上第二个日期当月天数
sumdays
+= monthdays
[isLearyear(year1
)][month1
-1] - day1
;
for (int i
= month1
; i
< 12; i
++)
sumdays
+= monthdays
[isLearyear(year1
)][i
];
for (int i
= year1
+ 1; i
< year2
; i
++)
sumdays
+= yeardays
[isLearyear(i
)];
for (int i
= 0; i
< month2
- 1; i
++)
sumdays
+= monthdays
[isLearyear(year2
)][i
];
sumdays
+= day2
;
代码实现
#include<bits/stdc++.h>
using namespace std
;
int monthdays
[2][12] = { { 31,28,31,30,31,30,31,31,30,31,30,31 },{ 31,29,31,30,31,30,31,31,30,31,30,31 } };
int yeardays
[2] = { 365,366 };
int isLearyear(int year
)
{
if (year
% 4 == 0 && year
% 100 != 0 || year
% 400 == 0)
return 1;
else
return 0;
}
int caldays(int year1
, int month1
, int day1
, int year2
, int month2
, int day2
)
{
int sumdays
= 0;
if (year1
== year2
&& month1
== month2
)
{
sumdays
= day2
- day1
;
}
else
{
if (year1
== year2
)
{
sumdays
+= monthdays
[isLearyear(year1
)][month1
-1] - day1
;
for (int i
= month1
; i
< month2
-1; i
++)
sumdays
+= monthdays
[isLearyear(year1
)][i
];
sumdays
+= day2
;
}
else
{
sumdays
+= monthdays
[isLearyear(year1
)][month1
-1] - day1
;
for (int i
= month1
; i
< 12; i
++)
sumdays
+= monthdays
[isLearyear(year1
)][i
];
for (int i
= year1
+ 1; i
< year2
; i
++)
sumdays
+= yeardays
[isLearyear(i
)];
for (int i
= 0; i
< month2
- 1; i
++)
sumdays
+= monthdays
[isLearyear(year2
)][i
];
sumdays
+= day2
;
}
}
return sumdays
;
}
int main()
{
int year1
, month1
, day1
, year2
, month2
, day2
;
cin
>> year1
>> month1
>> day1
>> year2
>> month2
>> day2
;
int days
= caldays(year1
, month1
, day1
, year2
, month2
, day2
);
cout
<< days
<< endl
;
return 0;
}
效果如下: