日期类的实现
来源:互联网 发布:excel4个数据相关矩阵 编辑:程序博客网 时间:2024/05/25 20:00
花式实现日期类。
#define _CRT_SECURE_NO_WARNINGS 1#include <iostream>#include <ctime>#include <cmath>using namespace std;class Date{public: Date() :_year(1) ,_month(1) ,_day(1) {} Date(int year, int month, int day) :_year(year) ,_month(month) ,_day(day) {} Date &operator++() { if (_month == 1 || _month == 3 || _month == 5 || _month == 7 || _month == 8 || _month == 10 || _month == 12) { if (_day < 31) { _day++; } else { if (_month < 12) { _day = 1; _month++; } else { _day = 1; _month = 1; _year++; } return *this; } } else if (_month == 4 || _month == 6 || _month == 9 || _month == 11) { if (_day < 31) { _day++; } else { _day = 1; _month++; } return *this; } else { if (DecideYear(*this) == 1) { if (_day < 28) { _day++; } else { _day = 1; _month++; } return *this; } else if (DecideYear(*this) == -1) { if (_day < 29) { _day++; return *this; } else { _day = 1; _month++; return *this; } } } return *this; } Date operator++(int) //后置 { Date T(_year, _month, _day); ++T; this->_day = T._day; this->_month = T._month; this->_year = T._year; return *this; } Date operator--(int) //后置 { Date T(_year, _month, _day); --T; this->_day = T._day; this->_month = T._month; this->_year = T._year; return *this; } Date &operator--()//前置-- { if ( _month == 5 || _month == 7 || _month == 8 || _month == 10 || _month == 12) { if (_day != 1) { _day--; } else { if (_month != 1) { _day = 30; _month--; } else { _day = 30; _month = 12; } } return *this; } else if (_month == 2 || _month == 4 || _month == 6 || _month == 9 || _month == 11) { if (_day != 1) { _day--; } else { _day = 31; _month--; } return *this; } else if (_month == 3) { if (_day != 1) { _day--; return *this; } else { if (DecideYear(*this) == 1) { _day = 29; _month--; return *this; } else { _day = 28; _month--; return *this; } } } else if (_month == 1) { if (_day != 1) { _day--; } else { _day = 30; _month = 12; _year--; } } return *this; } friend int DecideYear(const Date & t); //闰年 friend ostream& operator << (ostream &os, const Date & t); //输出运算重载 friend Date operator+(const Date &t, int days); friend Date operator-(const Date &t, int days); friend int operator-(const Date &t,const Date& d);private: int _year; int _month; int _day;};int DecideYear(const Date & t) //闰年{ if (t._year % 4 == 0 && t._year % 100 != 0 || t._year % 400 == 0) return 1; return -1;}ostream &operator<<(ostream &os, const Date &stu){ os <<stu._year<<" 年 " << stu._month<<" 月 " << stu._day << " 日 "; return os;}Date operator+(const Date &t, int days) //days天后的日期{ int i = 0; Date d = t; for (i = 0; i < days; i++) { d++; } return d;}Date operator-(const Date &t, int days) //days天前的日期{ int i = 0; Date d = t; for (i = 0; i < days; i++) { d--; } return d;}int operator-(const Date &t, const Date& d){ int count = 0; Date _t = t; Date _d = d; if (_t._year == _d._year) //2012 1 1 ~2012 2 2 { int num = 0; if (DecideYear(_t) > 0) { switch (_t._month) { case 1: num += _d._day; break; case 2: num += 31 + _d._day; break; case 3: num += 60 + _d._day; break; case 4: num += 91+ _d._day; break; case 5: num += 121 + _d._day; break; case 6: num += 152 + _d._day; break; case 7: num += 182 + _d._day; break; case 8: num += 213 + _d._day; break; case 9: num += 244 + _d._day; break; case 10: num += 274 + _d._day; break; case 11: num += 305 + _d._day; break; case 12: num += 335 + _d._day; break; } switch (_d._month) { case 1: count += _d._day; break; case 2: count += 31 + _d._day; break; case 3: count += 60 + _d._day; break; case 4: count += 91 + _d._day; break; case 5: count += 121 + _d._day; break; case 6: count += 152 + _d._day; break; case 7: count += 182 + _d._day; break; case 8: count += 213 + _d._day; break; case 9: count += 244 + _d._day; break; case 10: count += 274 + _d._day; break; case 11: count += 305 + _d._day; break; case 12: count += 335 + _d._day; break; } } if (DecideYear(_t) < 0) { switch (_t._month) { case 1: num += _d._day; break; case 2: num += 31 + _d._day; break; case 3: num += 59 + _d._day; break; case 4: num += 90 + _d._day; break; case 5: num += 120 + _d._day; break; case 6: num += 151 + _d._day; break; case 7: num += 181 + _d._day; break; case 8: num += 212 + _d._day; break; case 9: num += 243 + _d._day; break; case 10: num += 273 + _d._day; break; case 11: num += 304 + _d._day; break; case 12: num += 334 + _d._day; break; } switch (_d._month) { case 1: count += _d._day; break; case 2: count += 31 + _d._day; break; case 3: count += 59 + _d._day; break; case 4: count += 90 + _d._day; break; case 5: count += 120 + _d._day; break; case 6: count += 151 + _d._day; break; case 7: count += 181 + _d._day; break; case 8: count += 212 + _d._day; break; case 9: count += 243 + _d._day; break; case 10: count += 273 + _d._day; break; case 11: count += 304 + _d._day; break; case 12: count += 334 + _d._day; break; } } count = count - num; return count; } if (_t._year > _d._year) //2013~2012 { Date tmp = _t; _t = _d; _d = tmp; } if (_t._year < _d._year) //2012-2013~~ { if (DecideYear(_t) > 0) //如果左边是闰年 则开始判断不同月份开始的时间 { switch (_t._month) { case 1: count = 335 + 31 - _t._day; break; case 2: count = 306 + 29 - _t._day; break; case 3: count = 275 + 31 - _t._day; break; case 4: count = 245 + 30 - _t._day; break; case 5: count = 214 + 31 - _t._day; break; case 6: count = 184 + 30 - _t._day; break; case 7: count = 153 + 31 - _t._day; break; case 8: count = 122 + 31 - _t._day; break; case 9: count = 92 + 30 - _t._day; break; case 10: count = 61 + 31 - _t._day; break; case 11: count = 31 + 30 - _t._day; break; case 12: count = 31 - _t._day; break; } if (DecideYear(_d) < 0) //如果后面的不是闰年 { switch (_d._month) { case 1: count += _d._day; break; case 2: count += 31 + _d._day; break; case 3: count += 59 + _d._day; break; case 4: count += 90 + _d._day; break; case 5: count += 120 + _d._day; break; case 6: count += 151 + _d._day; break; case 7: count += 181 + _d._day; break; case 8: count += 212 + _d._day; break; case 9: count += 243 + _d._day; break; case 10: count += 273 + _d._day; break; case 11: count += 304 + _d._day; break; case 12: count += 334 + _d._day; break; } }if (DecideYear(_d) > 0) //如果后面的是闰年 { switch (_d._month) { case 1: count += _d._day; break; case 2: count += 31 + _d._day; break; case 3: count += 60 + _d._day; break; case 4: count += 91 + _d._day; break; case 5: count += 121 + _d._day; break; case 6: count += 152 + _d._day; break; case 7: count += 182 + _d._day; break; case 8: count += 213 + _d._day; break; case 9: count += 244 + _d._day; break; case 10: count += 274 + _d._day; break; case 11: count += 305 + _d._day; break; case 12: count += 335 + _d._day; break; } } } if (abs(_t._year - _d._year) > 2) { count += 365 * (abs(_t._year - _d._year) - 1); count += abs(_t._year - _d._year) % 4 ; } return count; } return count;}void Test(){ //time_t t1; //time(&t1); //tm* t_tm = localtime(&t1); //Date data1(t_tm->tm_year + 1900, t_tm->tm_mon + 1, t_tm->tm_mday); //读取计算机上的时间 //cout << data1 << endl; //++data1; //cout << data1 << endl; Date d2(2012, 1, 1); Date d1(2013, 2, 1); cout << d2-d1<< endl;}int main(){ Test(); system("pause");}
阅读全文
0 0
- 日期类的实现
- 日期类的实现
- 日期类的实现
- 日期类的实现
- 日期类的实现
- 日期类的实现
- 日期类的实现
- 自己实现的日期类
- C++:日期类的实现
- C++日期类的实现
- c++日期类的实现
- C++日期类的实现
- 日期类的简单实现
- C++日期类的实现
- 【c++】日期类的实现
- 完成日期类的实现
- c++日期类的实现
- C++ 自定义日期类实现日期的加减算法
- 设计模式总结
- Java核心技术
- 背包问题
- C#--登陆窗体完善与控件
- 三种交换网络:电路交换 报文交换 分组交换
- 日期类的实现
- 剑指offer--(12) 矩形覆盖
- C语言小问题--函数定义理解
- 欢迎使用CSDN-markdown编辑器
- 剑指offer--(13)二进制中1的个数
- 【数据结构】顺序表、单链表的 比较+总结
- tomcat8 源码 之单例模式
- 很好的一道面试题
- 关于元素和要素的问题