#include <iostream>
using namespace std;
static const unsigned char MonthTable[12] = {
31,28,31,30,31,30,31,31,30,31,30,31
};
class Date
{
public:
Date(int year, int month, int day);
Date operator -(const Date& date);
//获取时间差
int getDateDiff(const Date &d1 , const Date &d2);
void dispDiff(void);
public:
int year;
int month;
int day;
//时间差
int date_difference;
};
//获取相同年份的时间差
int getSameYearDays(const Date &d1, const Date &d2);
//获取相同月份的时间差
int getSameMonthDays(const Date &d1, const Date &d2);
//获取时间差
int getYearDays(const Date &d1, const Date &d2);
//是否为润年
bool isLeapYear(int year);
//比较时间大小
bool cmpDate(const Date &d1, const Date &d2);
Date::Date(int year = 2000, int month = 1, int day = 1)
{
this->year = year;
this->month = month;
this->day = day;
date_difference = 0;
}
int Date::getDateDiff(const Date &d1, const Date &d2)
{
if(cmpDate(d1, d2))
return getYearDays(d1, d2);
else
return getYearDays(d2, d1);
}
Date Date::operator -(const Date & date)
{
Date d;
d.date_difference = getDateDiff(*this, date);
return d;
}
void Date::dispDiff()
{
cout<<"days ="<< date_difference<<endl;
}
//比较时间大小
bool cmpDate(const Date &d1, const Date &d2)
{
int flage = false;
if(d1.year > d2.year)
{
flage = true;
}
else if(d1.year == d2.year)
{
if(d1.month > d2.month)
{
flage = true;
}
else if(d1.month == d2.month)
{
if(d1.day >= d2.day)
{
flage = true;
}
else
{
flage = false;
}
}
else
{
flage = false;
}
}
else
{
flage = false;
}
return flage;
}
bool isLeapYear(int year)
{
return (year % 4 == 0 && year %100 != 0) || year % 400 == 0 ? true : false;
}
//获取相同月份的时间差
int getSameMonthDays(const Date &d1, const Date &d2)
{
return d1.day - d2.day;
}
//获取相同年份的时间差
int getSameYearDays(const Date &d1, const Date &d2)
{
int days = 0;
//相同月份
if(d1.month == d2.month)
{
//获取相同月份的时间差
days = getSameMonthDays(d1, d2);
}
//不同月份
else
{
//获取第一月份的时间差
days = MonthTable[d2.month-1] - d2.day;
//二月并且是润年天数+1
if(d2.month == 2 && isLeapYear(d2.year))
{
days++;
}
//获取中间月份的时间差
for(int i = d2.month + 1; i < d1.month; i++)
{
if(i == 2 && isLeapYear(d1.year))
{
days += 29;
}
else
{
days += MonthTable[i -1];
}
}
//获取最后一月份的时间差
days += d1.day;
}
return days;
}
int getYearDays(const Date &d1, const Date &d2)
{
int days = 0;
//相同年份
if(d1.year == d2.year)
{
//获取相同年份的时间差
days = getSameYearDays(d1,d2);
}
//不同年份
else
{
//获取第一年的时间差
days = getSameYearDays(Date(d2.year,12,31), d2);
//获取中间年份的时间差
for(int i = d2.year + 1; i < d1.year; i++)
{
days += 365;
if(isLeapYear(i))
{
days++;
}
}
//获取最后一年的时间差
days += getSameYearDays(d1, Date(d1.year,1,1)) + 1;
}
return days;
}
int main()
{
Date d1(2000,1,1),d2(2010,1,1);
(d1 - d2).dispDiff();
return 0;
}