计算两个日期之间的天数

301 阅读2分钟

​持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第12天,点击查看活动详情

碎碎念念

咋一看题目好像不难啊,实际上还是有点麻烦的,有很多情况需要考虑到啊。

首先是每个月的天数不一样,然后闰年的也不一样,然后是……

仔细想想就傻眼了吧。

分析

对于输入进来的year、month和day,我们分三种情况计算。

最简单的情况,月份相同

直接两个day相减返回完事,从不拖泥带水。

然后是年份相同

首先判断一下是不是闰年,如果是闰年,把2月改成29天。

之后我们一个非常关键的函数必须用上,这个函数我们用来计算从当前日期开始直到过完本年的总天数,就是还有多少天过完这一年,即本年的剩余天数,我们把它暂时叫做remaindays,它的模样具体看代码。

有了这个函数之后呢,年份相同的情况就可以直接通过前一个日期本年剩余天数减去后一个日期本年剩余天数。

最后是年份不同的情况

首先我们先把这一年过完,即先调用remaindays函数计算本年剩余天数吗,然后年份自增直到和后一个年份相等,从整体来看到底差了多少年,差的每一年都来判断是否是闰年,是的话加上366天,不是的话就加上365天,这样一波下来,可以想到我们算多了天数,算多了后一个日期的本年剩余天数,最后把它减去完事。

额外

对于输入进来的前一个日期晚于后一个日期的情况,我们输出错误。

代码实现

#include"iostream"
using namespace std;
class Date
{
	int year, month, day;
public:
	Date(int year,int month,int day) :year(year), month(month), day(day) {}
	bool isleap(int year)
	{
		if (year % 400 == 0 || year % 4 == 0 && year % 100 != 0)
			return 1;
		return 0;
	}
	int remaindays()
	{
		long days;
		int i,leapyear[12] = { 31,29,31,30,31,30,31,31,30,31,30,31 },normalyear[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
		if (isleap(year))
		{
			days = leapyear[month - 1] - day;
			for (i = month; i < 12; i++)
				days += leapyear[i];
		}
		else
		{
			days = normalyear[month - 1] - day;
			for (i = month; i < 12; i++)
				days += normalyear[i];
		}
		return days;
	}
	friend int CountDay(Date &a,Date &b);
};

int CountDay(Date &a, Date &b)
{
	if (a.year > b.year)
		return -1;
	if (a.year == b.year && a.month > b.month)
		return -1;
	if (a.year == b.year && a.month == b.month && a.day > b.day)
		return -1;
	long daysss = a.remaindays();
	if (a.year < b.year)
	{
		for (int i = a.year+1; i <=b.year; i++)
			if (a.isleap(i))
				daysss += 366;
			else
				daysss += 365;
		daysss -= b.remaindays();
	}
	else if (a.year == b.year)
		daysss = a.remaindays() - b.remaindays();
	else
		daysss= b.day - a.day;
	return daysss;
}
int main()
{
	int year,month,day;
	cin>>year>>month>>day;
	Date a(year,month,day);
	cin>>year>>month>>day;
	Date b(year,month,day);
	if(CountDay(a,b)!=-1)
	cout<<CountDay(a,b)<<endl;
	else
	cout<<"Sorry, I can't do that!"<<endl;
}