#include<iostream>
using namespace std;
class Date
{
public:
Date(int year = 1900, int month = 1, int day = 1)
:_year(year)
, _month(month)
, _day(day)
{
if (!IsInvalidDate())
{
_year = 1900;
_month = 1;
_day = 1;
}
}
Date operator+(int days)
{
if (days<0)
return *this - (0 - days);
Date temp(*this);
temp._day += days;
int DaysOfMonth = 0;
while (temp._day >(DaysOfMonth = _CetDaysOfMonth(temp._year, temp._month)))
{
temp._day -= DaysOfMonth;
++temp._month;
if (temp._month > 12)
{
temp._year += 1;
temp._month = 1;
}
}
return temp;
}
Date operator-(int days)
{
if (days < 0)
return *this + (0 - days);
Date temp(*this);
temp._day -= days;
while(temp._day <= 0)
{
temp._month -= 1;
if (0 == temp._month)
{
temp._year -= 1;
temp._month = 12;
}
temp._day += _CetDaysOfMonth(temp._year, temp._month);
}
return temp;
}
Date& operator++()
{
*this = *this + 1;
return *this;
}
Date operator++(int)
{
Date temp(*this);
++(*this);
return temp;
}
Date& operator--()
{
*this = *this -1;
return *this;
}
Date operator--(int)
{
Date temp(*this);
--(*this);
return temp;
}
int operator-(const Date& d)
{
Date MinDate(*this);
Date MaxDate(d);
if (*this > d)
{
MinDate = d;
MaxDate = *this;
}
int count = 0;
while (MinDate != MaxDate)
{
++count;
++MinDate;
}
return count;
}
bool operator==(const Date & d)const
{
return _year == d._year &&
_month == d._month &&
_day == d._day;
}
bool operator>(const Date& d)const
{
if ((_year > d._year) ||
(_year == d._year && _month > d._month) ||
(_year == d._year && _month == d._month && _day > d._day))
{
return true;
}
return false;
}
bool operator!=(const Date& d)const
{
return !(*this == d);
}
private:
bool IsInvalidDate()
{
if (((_year >0) &&
(_month >0 && _month<13) &&
(_day > 0 && _day <= _CetDaysOfMonth(_year, _month))))
{
return true;
}
return false;
}
int _CetDaysOfMonth(int year, int month)
{
int days[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
if (2 == month && _IsLeapYear(year))
days[month] += 1;
return days[month];
}
bool _IsLeapYear(int year)
{
if ((0 == year % 4 && 0 != year % 100) ||
(0 == year % 400))
{
return true;
}
return false;
}
friend ostream& operator<<(ostream& _cout, const Date& d)
{
_cout << d._year << "-" << d._month << "-" << d._day;
return _cout;
}
friend istream& operator>>(istream& _cin, Date& d)
{
_cin >> d._year >> d._month >> d._day;
if (!d.IsInvalidDate())
cout << "输入的日期非法:" << d << endl;
return _cin;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date d1(2018, 11, 4);
cout << d1-999<< endl;
Date d2(2019, 1, 1);
cout << d1 - d2 << endl;
cout << d2 - d1 << endl;
return 0;
}