日期类及其各种操作

来源:互联网 发布:河南软件 编辑:程序博客网 时间:2024/06/05 18:46

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

例如:

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

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

日期+天数;

日期-天数;

日期-日期;

#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;}



原创粉丝点击