计算两个日期中间的天数
日常刷题碰到的,有计算两个日期之间天数的,有计算两个日期工作日数目的。这一类题目逻辑上算不上太难。只是没碰到过的话,第一时间可能想不好怎么处理。这里贴出来一条计算方法。
计算逻辑
打个比方是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 } }; //非闰年,2月28天,闰年2月29天
int yeardays[2] = { 365,366 }; //非闰年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) //年份一样,月份不一致 2020.3.15 -2020.5.5 应该是51天
{
sumdays += monthdays[isLearyear(year1)][month1-1] - day1; //第一个日期的当月剩余天数 3月剩余16天
for (int i = month1; i < month2-1; i++) //从第一个日期当月的第二个月开始计算剩余整月的天数 4月1日开始到5月1日 30天
{
sumdays += monthdays[isLearyear(year1)][i];
}
sumdays += day2; //5月天数 5.1-5.5 一共5天
}
年月都不一致
- 首先处理第一个日期当月到年底的整月的天数
- 计算两个日期中间整年天数
- 再加上第二个日期最后的整月的天数
- 最后加上第二个日期当月天数
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 } }; //非闰年,2月28天,闰年2月29天
int yeardays[2] = { 365,366 }; //非闰年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) //年份一样,月份不一致 2020.3.15 -2020.5.5 应该是51天
{
sumdays += monthdays[isLearyear(year1)][month1-1] - day1; //第一个日期的当月剩余天数 3月剩余16天
for (int i = month1; i < month2-1; i++) //从第一个日期当月的第二个月开始计算剩余整月的天数 4月1日开始到5月1日 30天
sumdays += monthdays[isLearyear(year1)][i];
sumdays += day2; //5月天数 5.1-5.5 一共5天
}
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;
}
效果如下: