C++中的Date類(日期類)
阿新 • • 發佈:2018-12-22
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