zoukankan      html  css  js  c++  java
  • C++实现日期类(Date类)

    #include<iostream>
    using namespace std;
    class Date
    {
    public:
        Date(int year = 1900, int month = 1, int day = 1)   //构造
        :_year(year)
        , _month(month)
        , _day(day)
        {
            if (!isInvalidDate(_year, _month, _day))
            {
                _year = 1900;
                _month = 1;
                _day = 1;
            }
        }
        
        Date operator+(int count)
        {
            Date tmp(*this);
            tmp._day += count;
            ToCorrect(tmp);
            return tmp;
        }
        Date operator-(int count)
        {
            Date tmp(*this);
            tmp._day -= count;
            ToCorrect(tmp);
            return tmp;
        }
        
        Date& operator++()   //前置++
        {
            (*this)++;
            return *this;
        }
        Date operator++(int)    //后置++
        {
            Date tmp(*this);
            (*this)+=1;
            return tmp;
        }
        Date& operator--()
        {
            (*this)--;
            return *this;
        }
        Date operator--(int)
        {
            Date tmp(*this);
            (*this)--;
            return tmp;
        }
        int operator-(const Date &d)
        {
            int flag = 1;
            Date max = *this;
            Date min = d;
            if (*this<d)
            {
                max = d;
                min = *this;
                flag = -1;
            }
            int count=0;
            while (min != max)
            {
                ++min;
                count++;
            }
            return count*flag;
        }
        Date& operator+=(int day)
        {
            *this = *this + day;
            return *this;
        }
        bool operator!=(const Date &d)
        {
            return !(*this == d);
        }
        bool operator<(const Date &d)
        {
            return !((*this>d)||(*this==d));
        }
        bool operator>=(const Date &d)
        {
            return !(*this<d);
        }
        bool operator>(const Date &d)
        {
            return (_year > d._year
                || (_year == d._year && _month > d._month)
                || (_year == d._year && _month == d._month && _day > d._day));
        }
        bool operator==(const Date &d)
        {
            return ((_year == d._year) && (_month == d._month) && (_day == d._day));
        }
        
    public:    
        bool IsLeapYear(int year)
        {
            if(year % 400 || (year % 4 && year % 100))
                return true;
            return false;
        }
        int YearsOfMonth(int year, int month)
        {
            int day;
            int days[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
            day = days[month];
            if (month == 2)
                day += IsLeapYear(year);
            return day;
        }
        
        Date ToCorrect(Date &d)
        {
            if (d._day>YearsOfMonth(d._year, d._month))
            {
                while (d._day > YearsOfMonth(d._year, d._month))
                {
                     d._day -= YearsOfMonth(d._year,d._month);

                    if (d._month == 12)
                    {
                        d._year++;
                        d._month = 1;
                    }
                    else
                    {
                        ++d._month;
                    }
                }
            }
            else
            {
                while (d._day <= 0)
                {
                    if (d._month == 1)
                    {
                        d._year--;
                        d._month = 12;
                    }
                    else
                    {
                        --d._month;
                    }
                    d._day += YearsOfMonth(d._year, d._month);
                }
            }
            return d;
        }
        

        bool isInvalidDate(int year, int month, int day)
        {
            if ((year < 1) || (month<0 || month>12) || (day<0 || day>YearsOfMonth(year,month)))
                return false;
            return true;
        }
        void Display()
        {
            cout << _year << "-" << _month << "-" << _day << endl;
        }
        friend istream& operator>>(istream& is, Date &d);
        friend ostream& operator<<(ostream& os, const Date &d);
    private:
        int _year;
        int _month;
        int _day;
    };
    istream& operator>>(istream& is, Date& d)
    {
        cout << "请输入一个日期" << endl;
        is >> d._year >> d._month >> d._day;
        return is;
    }

    ostream& operator<<(ostream& os, const Date &d)
    {
        cout << d._year << "-" <<d. _month << "-" << d._day << endl;
        return os;
    }
    int main()
    {
        /*Date d1(2016,8,18);
        //d1.Display();

        //d1 = d1++;
        cout << d1 << endl;*/

        //Date d1(2015, 12, 3);
        //(d1++).Display();  //d1.operator++(&d1, 0);
        //(++d1).Display(); //d1.operator++(&d1);

        Date d1(2015, 12, 3);
        Date d2(2015, 11, 1);
        cout << (d1 - d2) << endl;

        //Date d1(2015, 12, 3);
        //Date ret = d1 + 40; //operator+
        //ret.Display();


        /*Date d1(2015, 12, 3);
        Date ret = d1 + 40;
        d1 = ret;
        ret = d1 - 40;
        ret.Display();*/
        
        /*Date ret;
        Date d2(2015, 1, 1);
        ret = d2 - 1;
        ret.Display();*/
        return 0;
    }

  • 相关阅读:
    OpenGL纹理映射总结
    研究生常用网站:
    Oracle 11g,10g数据库软件下载地址
    <转>乔布斯羡慕嫉妒恨的人:Android之父安迪·鲁宾
    VC6里面的中文名字或者注释复制乱码解决
    基于CentOs的Hadoop集群全分布式部署<转>
    centos架设FTP服务器
    centos 卸载 jdk
    ESX的 企业版许可证
    vsftpd的 553 Could not create file
  • 原文地址:https://www.cnblogs.com/qingjiaowoxiaoxioashou/p/5783866.html
Copyright © 2011-2022 走看看