日期类及其各种操作
实现一个日期类,可以进行日期的各种操作。
例如:
日期的大小,相等或不等的比较;
日期的前置后置自增自减;
日期+天数;
日期-天数;
日期-日期;
#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;
}