1. 程式人生 > >C++中的Date類(日期類)

C++中的Date類(日期類)

C++中Date類用的比較多,所以通過查詢參考,自己寫了一個比較全面的Date類。

直接上程式碼

標頭檔案.h :

#ifndef DATE_H_INCLUDED
#define DATE_H_INCLUDED

#include <iostream>
using namespace std;

class Date
{
private:
    int year,month,day;
public:
    Date(){}
    Date(int year,int month,int day);
    Date(const Date &d):year(d.year),month(d.month),day(d.day){}
    ~Date(){}

    //得到年月日
    int getYear()const{return year;}
    int getMonth()const{return month;}
    int getDay()const{return day;}

    void setDate(int year,int month,int day);   //設定日期
    bool isLeapYear(int year)const;   //判斷是否為閏年
    int daysOfMonth(int year,int month)const;   //得到某個月的天數
    void show()const;   //顯示日期
    Date changeDays(const int days)const;   //改變日期
    int distance(const Date &d)const;   //計算兩個日期之間的天數

    /*過載運算子*/

    //日期加上days個天數
    friend Date operator +(const Date &d,const int days);
    friend Date operator +(const int days,const Date &d);
    Date& operator +=(int days);
    //日期自增一天
    Date& operator ++();
    Date operator ++(int);

    //日期減去days個天數
    friend Date operator -(const Date &d,const int days);
    friend int operator -(const Date &d1,const Date &d2);
    Date& operator -=(int days);
    //日期自減一天
    Date& operator --();
    Date operator --(int);

    //日期大小比較
    friend bool operator >(const Date &d1,const Date &d2);
    friend bool operator >=(const Date &d1,const Date &d2);
    friend bool operator <(const Date &d1,const Date &d2);
    friend bool operator <=(const Date &d1,const Date &d2);
    friend bool operator ==(const Date &d1,const Date &d2);
    friend bool operator !=(const Date &d1,const Date &d2);

    //輸出,輸入日期
    friend ostream& operator <<(ostream &out,const Date &d);
    friend istream& operator >>(istream &in,Date &d);
};

#endif // DATE_H_INCLUDED


CPP檔案.cpp :

#ifndef DATE_CPP
#define DATE_CPP

#include "Date.h"
#include <iostream>
#include <cstdlib>
using namespace std;

Date::Date(int year,int month,int day):year(year),month(month),day(day)
{
    if(year<=0 || month<=0||month>12 || day<=0||day>daysOfMonth(year,month)){
        cout<<"Error invalid date: ";
        show();
        cout<<endl;
        exit(-1);
    }
}

//設定日期
void Date::setDate(int year,int month,int day)
{
    this->year = year;
    this->month = month;
    this->day = day;
}

//判斷是否為閏年
bool Date::isLeapYear(int year)const
{
    return year%4==0&&year%100!=0 || year%400==0;
}

//得到某個月的天數
int Date::daysOfMonth(int year,int month)const
{
    int days = 0;

    switch(month)
    {
    case 1:
    case 3:
    case 5:
    case 7:
    case 8:
    case 10:
    case 12:
        days = 31;
        break;
    case 4:
    case 6:
    case 9:
    case 11:
        days = 30;
        break;
    case 2:
        days = 28+isLeapYear(year);
        break;
    }

    return days;
}

//顯示日期
void Date::show()const
{
    cout<<year<<"-"<<month<<"-"<<day<<endl;
}

//改變日期
Date Date::changeDays(const int days)const
{
    int yearTemp = year;
    int monthTemp = month;
    int dayTemp = day;

    if(days>0){
        dayTemp += days;

        while(dayTemp>daysOfMonth(yearTemp,monthTemp)){
            dayTemp -= daysOfMonth(yearTemp,monthTemp);

            monthTemp++;
            if(monthTemp>12){
                yearTemp++;
                monthTemp = 1;
            }
        }
    }else{   //days為負數
        dayTemp += days;

        while(dayTemp<1){
            monthTemp--;
            if(monthTemp<1){
                yearTemp--;
                monthTemp = 12;
            }
            dayTemp += daysOfMonth(yearTemp,monthTemp);
        }
    }

    return Date(yearTemp,monthTemp,dayTemp);
}

//計算兩個日期之間的天數
int Date::distance(const Date &d)const
{
    //儲存平年中某個月1月之前有多少天
    const int DAYS_OF_MONTH[] =
    {0,31,59,90,120,151,181,212,243,273,304,334,365};

    int years = year-d.year;
    int months = DAYS_OF_MONTH[month] - DAYS_OF_MONTH[d.month];
    int days = day - d.day;

    //4年一閏,100的倍數免潤,400的倍數再閏
    int totalDays = years*365+years/4-years/100+years/400
                    +months+days;

    return totalDays;
}

/*過載運算子*/

//日期加上days個天數
Date operator +(const Date &d,const int days)
{
    if(days==0){   //如果天數為0,返回當個月
        return d;
    }
    else
        return d.changeDays(days);
}

//日期加上days個天數的過載
Date operator +(const int days,const Date &d)
{
    if(days==0){   //如果天數為0,返回當個月
        return d;
    }
    else
        return d.changeDays(days);
}

//日期自身加上days個天數
Date& Date::operator +=(int days)
{
    if(days==0)
        return *this;
    else{
        *this = this->changeDays(days);
        return *this;
    }
}

//日期自增一天
Date& Date::operator ++()   //前置++
{
    *this = this->changeDays(1);
    return *this;
}

Date Date::operator ++(int)   //後置++
{
    Date dTemp(*this);
    ++(*this);
    return dTemp;
}

//日期減去days個天數
Date operator -(const Date &d,const int days)
{
    if(days==0){   //如果天數為0,返回當個月
        return d;
    }
    else
        return d.changeDays(-days);
}

//兩個日期相減,前一個日期必須大於後一個日期
int operator -(const Date &d1,const Date &d2)
{
    if(d1<d2){
        cout<<"被減數日期必須大於減數日期!"<<endl;
        exit(-1);
    }
    else if(d1==d2)
        return 0;
    else
        return d1.distance(d2);
}

//日期自身減去days個天數
Date& Date::operator -=(int days)
{
    if(days==0)
        return *this;
    else{
        *this = this->changeDays(-days);
        return *this;
    }
}

//日期自減一天
Date& Date::operator--()   //前置--
{
    *this = this->changeDays(-1);
    return *this;
}

Date Date::operator--(int)   //後置--
{
    Date dTemp(*this);
    --(*this);
    return dTemp;
}

//過載大小比較運算子
bool operator >(const Date &d1,const Date &d2)
{
    return d1.distance(d2)>0 ? true:false;
}

bool operator >=(const Date &d1,const Date &d2)
{
    return d1.distance(d2)>=0 ? true:false;
}

bool operator <(const Date &d1,const Date &d2)
{
    return d1.distance(d2)<0 ? true:false;
}

bool operator <=(const Date &d1,const Date &d2)
{
    return d1.distance(d2)<=0 ? true:false;
}

bool operator ==(const Date &d1,const Date &d2)
{
    return d1.distance(d2)==0 ? true:false;
}

bool operator !=(const Date &d1,const Date &d2)
{
    return d1.distance(d2)!=0 ? true:false;
}

//過載輸入輸出運算子
ostream& operator <<(ostream &out,const Date &d)
{
    out<<d.getYear()<<"-"
       <<d.getMonth()<<"-"
       <<d.getDay()<<endl;

    return out;
}

istream& operator >>(istream &in,Date &d)
{
    int year,month,day;

    cout<<"Input year-month-day:"<<endl;
    in>>year>>month>>day;

    d.setDate(year,month,day);

    return in;
}

#endif // DATE_CPP