#include<iostream>
using namespace std;
class Date
{
public:
	Date(int year , int month , int day ,int after_day)
		:_year(year)
		, _month(month)
		, _day(day)
	{
		Add_day(_year,_month,_day,after_day);
	}
	Date(int year, int month, int day)
		:_year(year)
		, _month(month)
		, _day(day)
	{}
	bool operator=(Date &d)
	{
		_year = d._year,
		_month = d._month,
		_day = d._day;
	}
	bool operator>(Date &d)//比较两个日期的大小
	{
		if (_year > d._year)
		{
			return true;
		}
		else if (_year < d._year)
		{
			return false;
		}
		else
		{
			if (_month>d._month)
			{
				return true;
			}
			else if (_month<d._month)
			{
				return false;
			}
			else
			{
				if (_day>d._day)
				{
					return true;
				}
				else
				{
					return false;
				}
			}
		}
	}
	int operator-(Date &d)
	{
		int _month_tmp,d_month_tmp;
		_month_tmp = _month;
		d_month_tmp=d._month;
		int ret = 0;
		int count = 0;
		if (_year != d._year)
		{
			int _year_tmp, d_year_tmp;
			_year_tmp = _year;
			d_year_tmp = d._year;
			if (_year_tmp < d_year_tmp)
			{
				while (_year_tmp != d_year_tmp)
				{
					if ((_year_tmp % 400 == 0) || ((_year_tmp % 4 == 0) && (_year_tmp % 100 != 0)))
					{
						count += 366;
					}
					else
					{
						count += 365;
					}
					_year_tmp++;
				}
				if (_month>=2)
					count -= 1;
				count *= (-1);
			}
			else if (_year_tmp > d_year_tmp)
			{
				int _year_tmp, d_year_tmp;
				_year_tmp = _year;
				d_year_tmp = d._year;
				while (d_year_tmp != _year_tmp)
				{
					if ((d_year_tmp % 400 == 0) || ((d_year_tmp % 4 == 0) && (d_year_tmp % 100 != 0)))
					{
						count += 366;
					}
					else
					{
						count += 365;
					}
					d_year_tmp++;
				}
				if (_month>=2)
					count -= 1;
			}
		}
		if (_month_tmp == d_month_tmp)
		{
			return(count+_day - d._day);
		}
		while (_month_tmp != d_month_tmp)
		{
			if (_month_tmp < d_month_tmp)
			{
				count -= Every_month(d._year, _month_tmp);
				_month_tmp++;
			}
			else if (_month_tmp >= d_month_tmp)
			{
				count += Every_month(d._year, d_month_tmp);
				d_month_tmp++;
			}
		}
		if (_day >d._day)
		{	
			count += _day - d._day;;
		}
		else if (_day <= d._day)
		{
			count += _day - d._day;
		}
		return count;
	}
	int Every_month(int year, int month)//返回该年所对应月份的天数
	{
		if (month<1 || month>12)
		{
			exit(0);
		}
		if (month == 2)
		{
			if ((year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0)))
			{
				return 29;
			}
			else
			{
				return 28;
			}
		}
		else if (month == 4 || month == 6 || month == 9 || month == 11)
		{
			return 30;
		}
		else if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12)
		{
			return 31;
		}
	}
	void Add_day(int& year, int& month, int& day, int& after_day)
	{
		while (after_day>0)
		{
			int count = Every_month(year, month);
			if (after_day - count > 0)
			{
				if (month == 12)
				{
					year++;
					month = 0;
				}
				month++;
				after_day -= count;
			}
			else if (after_day - count < 0)
			{
				if (day + after_day <= count)
				{
					day += after_day;
					break;
				}
				else
				{
					day = day + after_day - count;
					if (month == 12)
					{
						year++;
						month = 0;
					}
					month++;
					break;
				}
			}
			else
			{
				if (month == 12)
				{
					year++;
					month = 0;
				}
				month++;
				break;
			}
		}
	}
	void Display(char*p,int n)
	{
		cout <<p<<"之后的"<<n<<"天后是:"<< _year << "-" << _month << "-" << _day << endl;
	}
	~Date()
	{
	}
private:
	int _year;
	int _month;
	int _day;
};

void Test1()//计算某个日期的几天后的日期
{
	Date d1(2015, 12, 15, 138);
	d1.Display("d1",138);
}
void Test2()//计算两个日期相差的天数
{
	Date d2(1990, 3, 17);
	Date d3(2017, 1, 1);
	int ret=d2 - d3;
	cout << "d2比d3多"<<ret<<"天"<< endl;
}
Date Test3()//比较日期大小
{
	Date d4(2015, 4, 5);
	Date d5(2015, 9, 4);
	bool ret=d4 > d5;
	if (ret != 0)
	{
		cout << "d4>d5" << endl;
		return d4;
	}
	else
	{
		cout << "d5>d4" << endl;
		return d5;
	}	
}
int main()
{
	Test1();
	Test2();
	Test3();
	system("pause");
	return 0;
}