C++之实现日期类

通常我们想计算某一天到另一天的距离时,要是间隔太大,我们就回去利用网上的日期计算器去算。

今天,这篇博客就是教我们如何去实现一个简单的日期计算器。

想要去实现某个功能其实并不是很难,难点在于我们综合起来地去考虑闰年或者月份的天数这块。

代码块:

Date.h
#define _CRT_SECURE_NO_WARNINGS 1
#include<assert.h>
#include<iostream>
using namespace std;
class Date
{
public:
	Date(int year = 1999, int month = 1, int day = 1)//初始化列表
		:_year(year)
		, _month(month)
		, _day(day)
	{
		if (!IsInvalid()) //在构造函数里面判断是否存在这一天,非法的话就直接退出
		{
			Date::Show();
			cout << "是非法日期!" << endl;
			exit(-1);
		}
	}
	Date(const Date& d)//------------------------------------拷贝构造函数
	{
		if (d._year > 0 && (d._month > 0 && d._month<13) && d._day>0 && d._day <= GetMonthDay(d._year, d._month))
		{
			this->_year = d._year;
			this->_month = d._month;
			this->_day = d._day;
		}
	}
	Date& operator=(const Date& d)//---------------------------赋值运算符重载
	{
		if (d._year > 0 && (d._month > 0 && d._month<13) && d._day>0 && d._day <= GetMonthDay(d._year, d._month))
		{
			this->_year = d._year;
			this->_month = d._month;
			this->_day = d._day;
		}
		return *this;
	}
	~Date()
	{}
	bool IsInvalid(void)//-------------------------------------判断是否合法函数
	{
		if (_day > 0 && _day <= GetMonthDay(_year, _month) && _month > 0 && _month<13 && _year>0)
		{
			return true;
		}
		return false;
	}
	bool isLeapYear(int year)//-------------------------------判断是否为闰年
	{
		if (year % 4 == 0 && year % 100 != 0)//两个条件
		{
			//cout << year << "  is Leap Year" << endl;
			return true;
		}
		if (year % 400 == 0)
		{
			//cout << year << "  is Leap Year" << endl;
			return true;
		}
		//cout << year << "  Is Not Leap Year" << endl;
		return false;
	}
	int GetMonthDay(int year, int month)//--------------------获取当月天数
	{
		int arr[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
		int day = arr[month - 1];//数组是从0开始
		if (month == 2 && isLeapYear(year))//闰年的2月加1天
		{
			day += 1;
		}
		return day;
	}
	void Show()//-----------------------------------------打印函数
	{
		cout << "日期:" << _year << "-" << _month << "-" << _day << endl;
	}
	bool operator==(const Date& d)//-------------------等号重载函数
	{
		if (_year == d._year&&_month == d._month&&_day == d._day)
		{
			return true;
		}
		return false;
	}
	bool operator!=(const Date& d)//---------------------不等号重载函数
	{
		return _year != d._year || _month != d._month || _day != d._day;
	}
	bool operator>=(const Date& d)//--------------------大于或等于号重载函数
	{
		if (_year > d._year)
		{
			return true;
		}
		else if (_year == d._year)
		{
			if (_month > d._month)
			{
				return true;
			}
			else if (_month == d._month)
			{
				if (_day >= d._day)
				{
					return true;
				}
			}
		}
		return false;
	}
	bool operator<=(const Date& d)//------------------小于或等于号重载函数
	{
		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)//--------------------大于号重载函数
	{
		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)//-------------------小于号重载函数
	{
		if (_year < d._year || (_year == d._year&&_month<d._month) || (_year == d._year&&_month == d._month&&_day < d._day))
		{
			return true;
		}
		return false;
	}
	Date operator+(int day)//------------------------加上某个天数,返回一个日期
	{
		Date tmp = *this;
		tmp._day += day;
		if (tmp._day>GetMonthDay(tmp._year, tmp._month))//调用Get函数之前主要要考虑月份是否正确
		{
			tmp._day -= GetMonthDay(tmp._year, tmp._month);
			tmp._month += 1;
			if (tmp._month > 12)
			{
				tmp._year += 1;
				tmp._month -= 12;
			}
		}
		return tmp;
	}
	Date& operator+=(int day)//--------------------------基本同上,返回引用
	{
		return *this = operator+(day);
	}
	Date operator-(int day)//------------------------------减去天数,返回一个日期
	{
		Date tmp = *this;
		if (day<0)//当day是负数的情况,往前倒退
		{
			tmp._day += (-day);
			while (tmp._day>GetMonthDay(tmp._year, tmp._month))
			{
				tmp._day -= GetMonthDay(tmp._year, tmp._month);//减当月的天数
				if (tmp._month == 12)
				{
					tmp._year += 1;
					tmp._month = 1;
				}
				else
				{
					tmp._month += 1;
				}
			}
			return tmp;
		}
		while (day>tmp._day)//正数
		{
			day -= tmp._day;//把当月的天数置0
			tmp._month -= 1;//月份减1
			if (tmp._month == 0)
			{
				tmp._year -= 1;
				tmp._month = 12;
			}
			tmp._day = GetMonthDay(tmp._year, tmp._month);//得到上一个月的最后一天
		}
		tmp._day -= day;
		return tmp;
	}
	Date& operator-=(int day)//---------------------------------------返回引用
	{
		*this = operator-(day);
		return *this;
	}
	int operator-(Date& d)//----------------------------------减去一个日期,返回相隔天数
	{
		if (_year < d._year)
		{
			Date tmp = d;
			d = *this;
			*this = tmp;
		}
		else if (_year == d._year&&_month<d._month)
		{
			Date tmp = d;
			d = *this;
			*this = tmp;
		}
		else if (_year == d._year&&_month == d._month&&_day < d._day)
		{
			Date tmp = d;
			d = *this;
			*this = tmp;
		}
		Date tmp1(*this);//tmp1为较大值
		Date tmp2(d);//tmp2为较小值
		int count = 0;
		while (tmp1>tmp2)
		{
			tmp2.operator++();
			count++;
		}
		return count;
	}
	//++d1 
	Date& operator++() //------------------------------------------- 前置++
	{
		++_day;
		if (_day > GetMonthDay(_year, _month))
		{
			_day -= GetMonthDay(_year, _month);
			_month += 1;
			if (_month > 12)
			{
				_year += 1;
				_month = 1;
			}
		}
		return *this;
	}
	//d1++ 
	Date operator++(int)//-------------------------------------- 后置 ++
	{
		_day++;
		if (_day > GetMonthDay(_year, _month))
		{
			_day -= GetMonthDay(_year, _month);
			_month += 1;
			if (_month > 12)
			{
				_year += 1;
				_month = 1;
			}
		}
		return *this;
	}
	Date operator--()//----------------------------------------前置--
	{
		--_day;
		if (_day == 0)
		{
			_month--;
			_day = GetMonthDay(_year, _month);
			if (_month == 0)
			{
				_month = 12;
				_year -= 1;
			}
		}
		return *this;
	}
	Date operator--(int)//------------------------------------后置--
	{
		_day--;
		if (_day == 0)
		{
			_month--;
			_day = GetMonthDay(_year, _month);
			if (_month == 0)
			{
				_month = 12;
				_year -= 1;
			}
		}
		return *this;
	}
	Date Get_year()
	{
		return _year;
	}
	Date Get_month()
	{
		return _month;
	}
	Date Get_day()
	{
		return _day;
	}
private:
	int _year;
	int _month;
	int _day;
};


Date.cpp


#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
#include<iostream>
using namespace std;
#include"Date.h"

int main()
{
	Date d(2008,12,24);
	Date d1(2008, 1, 2);
	d.operator-(-26);
	system("pause");
	return 0;
}


猜你喜欢

转载自blog.csdn.net/komacc/article/details/80361771
今日推荐