日期类及其各种操作
来源:互联网 发布:河南软件 编辑:程序博客网 时间: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;}
阅读全文
0 0
- 日期类及其各种操作
- 单链表的模版类及其各种操作
- 各种操作符及其优先级
- asp.net各种日期操作
- Java 日期的各种操作
- 二叉查找树 各种操作及其初始化
- 获取当前日期时间及其它操作
- python 日期相关的各种操作总结
- python 日期相关的各种操作总结
- Js获取当前日期时间及其它时间操作操作
- Java 日期类及其处理
- c++ 数据结构 稀疏矩阵类的定义及其各种操作的实现
- 各种时间日期工具类
- Js获取当前日期时间及其它操作
- Js获取当前日期时间及其它操作 【转】
- Js获取当前日期时间及其它操作
- Js获取当前日期时间及其它操作
- Js获取当前日期时间及其它操作
- 关于C/C++中typedef的定义与用法总结
- 关于js自执行函数
- python实现剑指offer系列:重建二叉树
- 如何将oracle用户A中某个表的数据导入到用户B中的一个表
- weixin4j开发—为大家提供一个获取Weixin对象的工具类
- 日期类及其各种操作
- 459. Repeated Substring Pattern
- UE4 Ansel插件的启动
- 历时28天,阳大铁路全线首座大桥简支T梁架设圆满完成
- jsp表单提交的两种方式对应的乱码解决方法
- LabVIEW之TDMS学习笔记
- 卷积神经网络调参技巧
- POJ 1836 Alignment <LIS(单调栈优化)>
- Java输出当前的日期(年月日时分秒毫秒)