#include <iostream>
using namespace std;
int notLeapYear[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };//平年每月日数
int LeapYear[12] = { 31,29,31,30,31,30,31,31,30,31,30,31 };//闰年每月日数
class CDate
{
private:
int year, month, day;//时间数据
public:
void input();//输入时间函数
friend int SubDay(const CDate& d1, const CDate& d2);//计算时间差函数(自动判断第二个时间是否大于第一个)
};
bool ifLeapYear(int _year)//判断是否为闰年
{
if ((_year % 4 == 0 && _year % 100 != 0) || _year % 400 == 0)
return true;
else
return false;
}
void CDate::input()
{
while (1)
{
cin >> year >> month >> day;
if (year >= 1 && month >= 1 && month <= 12)//判断输入格式是否正确
{
if (ifLeapYear(year))
{
if (day >= 1 && day <= LeapYear[month - 1])
break;
else
{
cout << "未输入正确的日期!";
continue;
}
}
else
{
if (day >= 1 && day <= notLeapYear[month - 1])
break;
else
{
cout << "未输入正确的日期!";
continue;
}
}
}
else
{
cout << "未输入正确的日期!";
continue;
}
}
}
int SubDay(const CDate& d1, const CDate& d2)
{
if (d2.year > d1.year || ((d2.year == d1.year)&&((d2.month * 30 + d2.day) >= (d1.month * 30 + d1.day))))//判断第二个日期是否大于第一个
{
int subDay=0;
int _day = d1.day;
int _year = d1.year;
int _month = d1.month;
for (; ; _year++)
{
for (; ; _month++)
{
if (ifLeapYear(_year) == true)
{
for (; ; _day++)
{
if (_year == d2.year && _month == d2.month && _day == d2.day)
{
return subDay;
}
else
subDay++;
if (_day == LeapYear[_month - 1])
{
_day = 1;
break;
}
}
}
else
{
for (; ; _day++)
{
if (_year == d2.year && _month == d2.month && _day == d2.day)
{
return subDay;
}
else
subDay++;
if (_day == notLeapYear[_month - 1])
{
_day = 1;
break;
}
}
}
if (_month == 12)
{
_month = 1;
break;
}
}
}
}
else
{
cout << "第二个日期小于第一个,无法计算!" << endl;
return 0;
}
}
int main()
{
CDate day1, day2;
int d;
day1.input();
day2.input();
d = SubDay(day1, day2); //两个日期相差的天数。
cout << d << endl;
return 0;
}
效果图: