#include<iostream>
using namespace std;
int mdays[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//月份所含日期数组
class Date//日期类
{
public:
int year,month,day;
Date(int x,int y,int z) {year=x,month=y,day=z;}//构造日期
Date() {}//构造空
~Date(){}//释放
int days(Date v);//求这一年的第几天
int operator-(Date v);//求两个日期的间隔天数
bool operator>(Date v);//判断日期是否更早
bool operator<(Date v);//判断日期是否更晚
void operator/=(Date &v);//交换两个日期
void operator=(Date v);//日期赋值
void print();//输出日期
};
bool leapyear(int x)//判断闰年的函数
{
return (x%100==0&&x%400==0||x%100!=0&&x%4==0);//判断闰年的方法
}
bool Date::operator>(Date v)//判断日期更早的运算符
{
return (year<v.year||year==v.year&&month<v.month||year==v.year&&month==v.month&&day<v.day);//这个日期更早的三种情况
}
bool Date::operator<(Date v)//判断日期更晚的运算符
{
return (year>v.year||year==v.year&&month>v.month||year==v.year&&month==v.month&&day>v.day);//这个日期更晚的三种情况
}
void Date::operator/=(Date &v)//交换日期的运算符
{
swap(year,v.year);//交换年
swap(month,v.month);//交换月
swap(day,v.day);//交换日
}
int Date::days(Date u)//求日期是本年的第多少天
{
int s=u.day;//加上最后一个月的日期
for(int i=1;i<u.month;i++)//累加前几个月的日子
{
s+=mdays[i];
if(i==2)//判断是否闰年,二月28/29天
{
if(leapyear(u.year)) s++;
}
}
return s;
}
void Date::operator=(Date v)//日期赋值
{
(*this).year=v.year;
(*this).month=v.month;
(*this).day=v.day;
}
int Date::operator-(Date v)//求算间隔
{
Date u=(*this);
if((*this)<v) u/=v; //保证日期更早的在前,为u,日期较小的在后,为v
//u.print();
//v.print();
int day1=days(u),day2=days(v);//计算公式为u.year~z.year-1完整年度所包含天数-u在本年的第多少天+v在本年的第多少天+1
//cout<<day1<<' '<<day2<<endl;
for(int i=u.year;i<v.year;i++)//计算整年天数
{
if(leapyear(i)) day2+=366;
else day2+=365;
//cout<<i<<' '<<day2<<endl;
}
day2-=day1;//减掉u在本年的第多少天
return day2+1;//+1
}
void Date::print()//输出日期
{
printf("%d.%d.%d\n",year,month,day);//格式为XX.X.X
}
int main()
{
Date AO(2000,7,1);//AO的生日为2000.7.1
Date XIANG(1983,7,21);//XIANG的生日为1983.7.21
AO/=XIANG;//交换AO和XIANG的生日
AO.print();//输出AO的生日
XIANG.print();//输出XIANG的生日
printf("%d",AO-XIANG);//输出间隔多少天
}