#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);//輸出間隔多少天
}