日期类及其各种操作

实现一个日期类,可以进行日期的各种操作。

例如:

日期的大小,相等或不等的比较;

日期的前置后置自增自减;

日期+天数;

日期-天数;

日期-日期;

#include <iostream>
using namespace std;
#include <assert.h>

class Date 
{ 
public: 
//4个默认的成员函数 
//构造、拷贝构造、赋值语句重载、析构函数 
	//构造函数
	Date(int year=1900, int month=1, int day=1)
		:_year(year)
		,_month(month)
		,_day(day)
	{
		cout<<"初始化列表"<<endl;
	}
	//拷贝构造函数
	Date(const Date& d)
	{
		_year = d._year;
		_month = d._month;
		_day = d._day;
	}
	//析构函数
	~Date()
	{
		cout<<"~Date()析构函数:"<<endl;
	}
	//赋值语句重载
	Date& operator=(const Date& d)
	{
		if(this != &d)
		{
			_year = d._year;
			_month = d._month;
			_day = d._day;
		}
		return *this;
	}
public: 
//日期比较 
	bool operator==(const Date& d)
	{
		if((_year==d._year)&&(_month==d._month)&&(_day==d._day))
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	bool operator!=(const Date& d)
	{
		if((_year==d._year)&&(_month==d._month)&&(_day==d._day))
		{
			return false;
		}
		else
		{
			return true;
		}
	}
	bool operator>(const Date& d)
	{
		if(_year>d._year)
		{
			return true;
		}
		if((_year==d._year)&&(_month>d._month))
		{
			return true;
		}
		if((_year==d._year)&&(_month==d._month)&&(_day>d._day))
		{
			return true;
		}
		return false;
	}
	bool operator>=(const Date& d)
	{
		if(((*this).operator==(d))&&(*this).operator>(d))
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	bool operator<(const Date& d)
	{
		if(!((*this).operator>(d)))
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	bool operator<=(const Date& d)
	{
		if(((*this).operator<(d))&&((*this).operator==(d)))
		{
			return true;
		}
		else
		{
			return false;
		}
	}
public: 
	Date& operator++()   //前置++
	{
		_day = _day+1;
		if((_month == 1)||
			(_month == 3)||
			(_month == 5)||
			(_month == 7)||
			(_month == 8)||
			(_month == 10)||
			(_month == 12))     //处理大月份
		{
			if(_day>31)
			{
				_month = _month+1;
				_day = 1;
				if(_month > 12)
				{
					_year = _year + 1;
					_month = 1;
				}
			}
		}
		else if((_month == 4)||
			(_month == 6)||
			(_month == 9)||
			(_month == 11))      //处理小月份
		{
			if(_day>30)
			{
				_month = _month + 1;
				_day = 1;
			}
		}
		else if(_month == 2)      //如果为2月时,判断是否为闰年
		{
			if((_year%4==0)&&(_year%100!=0)||(_year%400==0))
			{
				if(_day>29)
				{
					_month = _month + 1;
					_day = 1;
				}
			}
			else
			{
				if(_day>28)
				{
					_month = _month + 1;
					_day = 1;
				}
			}
		}
		return *this;
	}
	Date& operator++(int)   //后置++
	{
		Date tmp(*this);
		_day = _day+1;
		if((_month == 1)||
			(_month == 3)||
			(_month == 5)||
			(_month == 7)||
			(_month == 8)||
			(_month == 10)||
			(_month == 12))     //处理大月份
		{
			if(_day>31)
			{
				_month = _month+1;
				_day = 1;
				if(_month > 12)
				{
					_year = _year + 1;
					_month = 1;
				}
			}
		}
		else if((_month == 4)||
			(_month == 6)||
			(_month == 9)||
			(_month == 11))      //处理小月份
		{
			if(_day>30)
			{
				_month = _month + 1;
				_day = 1;
			}
		}
		else if(_month == 2)      //如果为2月时,判断是否为闰年
		{
			if((_year%4==0)&&(_year%100!=0)||(_year%400==0))
			{
				if(_day>29)
				{
					_month = _month + 1;
					_day = 1;
				}
			}
			else
			{
				if(_day>28)
				{
					_month = _month + 1;
					_day = 1;
				}
			}
		}
		return tmp;
	}
	Date& operator--()   //前置--
	{
		_day = _day-1;
		if(_day==0)
		{
			_month = _month - 1;
			if((_month == 1)||
			(_month == 3)||
			(_month == 5)||
			(_month == 7)||
			(_month == 8)||
			(_month == 10))   //处理大月份
			{
				_day = 31;
			}
			else if((_month == 4)||
			(_month == 6)||
			(_month == 9)||
			(_month == 11))
			{
				_day = 30;
			}
			else if(_month == 2)
			{
				if((_year%4==0)&&(_year%100!=0)||(_year%400==0)) //如果为闰年
				{
					_day = 29;
						 
			    }
				else     //如果不为闰年
				{
					_day = 28;
				}
			}
			else if(_month == 0)  //若减之前为1月时,减完需处理。
			{
				_year = _year - 1;
				_month = 12;
				_day = 31;
			}
		}
		return *this;
	}
	Date& operator--(int)  //后置--
	{
		Date tmp(*this);
		_day = _day-1;
		if(_day==0)
		{
			_month = _month - 1;
			if((_month == 1)||
			(_month == 3)||
			(_month == 5)||
			(_month == 7)||
			(_month == 8)||
			(_month == 10))   //处理大月份
			{
				_day = 31;
			}
			else if((_month == 4)||
			(_month == 6)||
			(_month == 9)||
			(_month == 11))
			{
				_day = 30;
			}
			else if(_month == 2)
			{
				if(IsLeap()) //如果为闰年
				{
					_day = 29;
						 
			    }
				else     //如果不为闰年
				{
					_day = 28;
				}
			}
			else if(_month == 0)  //若减之前为1月时,减完需处理。
			{
				_year = _year - 1;
				_month = 12;
				_day = 31;
			}
		}
		return tmp;
	}
	bool IsLeap()  
	{  
		if ((_year % 4 == 0 && _year % 100 != 0) || _year % 400 == 0)  
		{  
			return true;  
		}  
		return false;  
	}

	int GetMonthDay(int year, int month)   //计算一个某年某月有多少天
	{
		assert(month > 0 && month <= 12);  
		int arr_monthday[] = { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };  
		int day;  
		if ((!IsLeap()) && month == 2)  
		{  
			_day = arr_monthday[month] - 1;  
		}  
		day = arr_monthday[month];  
		return day;  
	}


	//日期+天数 
	Date operator+(int day)
	{
		Date tmp(*this);  
		if (day < 0)  
		{  
			return  tmp + (-day);  
		}  
		tmp._day += day;  
		while (tmp._day> GetMonthDay(tmp._year, tmp._month))  
		{  
			tmp._day = tmp._day - GetMonthDay(tmp._year, tmp._month);
			if (tmp._month == 12)  
			{  
				tmp._year++;  
				tmp._month = 1;  
			}  
			else  
			{  
				tmp._month++;  
			}  
		}  
		return tmp;  
	}
	////日期-天数 
	Date operator-(int day)
	{
		Date tmp(*this);  
		if (day < 0)  
		{  
			return  tmp - (-day);  
		}  
		tmp._day -= day;  
		while (tmp._day<=0)  
		{  
			if (tmp._month == 1)  
			{  
				tmp._year--;  
				tmp._month = 12;  
			}  
			else  
			{  
				--tmp._month;  
			}  
			tmp._day = tmp._day + GetMonthDay(tmp._year, tmp._month);
		}  
		return tmp;  
	}
	////日期-日期 
	int operator-(const Date& d)
	{
		Date Max(*this);  
		Date Min(d);  
		int flag = 1;  
		if ( *this < d)  
		{  
			Max = d;  
			Min= *this;  
			flag = -1;  
		}  
		int days = 0;  
		while (Max != Min)  
		{  
			--Max;  
			++days;  
		}  
		return days*flag;  
	}
	void Display()
	{
		cout<<_year<<"-"<<_month<<"-"<<_day<<endl;
	}
private: 
	int _year;//年 
	int _month;//月 
	int _day;//日 
}; 
测试代码如下:
int main()
{
	Date d1(2017,1,1);
	Date d2(2018,2,2);
	Date d3(0,0,0);
	int days = 0;
	//d3 = ++d1;
	//d3 = d1++;
	//d3 = --d1;
	//d3 = d1+62;
	//d3 = d1-32;
	days = d2-d1;
	cout<<days<<endl;
	/*if(d1>=d2)
	{
		cout<<"1"<<endl;
	}
	else
	{
		cout<<"0"<<endl;
	}*/
	return 0;
}



全部评论

相关推荐

SinyWu:七院电话面的时候问我有没有女朋友,一听异地说你赶紧分。我:???
点赞 评论 收藏
分享
Bug压路:老哥看得出来你是想多展示一些项目,但好像一般最多两个就够了😂页数一般一页,多的也就2页;这些项目应该是比较同质化的,和评论区其他大佬一样,我也觉得应该展示一些最拿手的(质量>数量)😁😁😁专业技能部分也可以稍微精简一些
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务