日期类的实现

来源:互联网 发布: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");}
原创粉丝点击