通常我们想计算某一天到另一天的距离时,要是间隔太大,我们就回去利用网上的日期计算器去算。
今天,这篇博客就是教我们如何去实现一个简单的日期计算器。
想要去实现某个功能其实并不是很难,难点在于我们综合起来地去考虑闰年或者月份的天数这块。
代码块:
Date.h
#define _CRT_SECURE_NO_WARNINGS 1 #include<assert.h> #include<iostream> using namespace std; class Date { public: Date(int year = 1999, int month = 1, int day = 1)//初始化列表 :_year(year) , _month(month) , _day(day) { if (!IsInvalid()) //在构造函数里面判断是否存在这一天,非法的话就直接退出 { Date::Show(); cout << "是非法日期!" << endl; exit(-1); } } Date(const Date& d)//------------------------------------拷贝构造函数 { if (d._year > 0 && (d._month > 0 && d._month<13) && d._day>0 && d._day <= GetMonthDay(d._year, d._month)) { this->_year = d._year; this->_month = d._month; this->_day = d._day; } } Date& operator=(const Date& d)//---------------------------赋值运算符重载 { if (d._year > 0 && (d._month > 0 && d._month<13) && d._day>0 && d._day <= GetMonthDay(d._year, d._month)) { this->_year = d._year; this->_month = d._month; this->_day = d._day; } return *this; } ~Date() {} bool IsInvalid(void)//-------------------------------------判断是否合法函数 { if (_day > 0 && _day <= GetMonthDay(_year, _month) && _month > 0 && _month<13 && _year>0) { return true; } return false; } bool isLeapYear(int year)//-------------------------------判断是否为闰年 { if (year % 4 == 0 && year % 100 != 0)//两个条件 { //cout << year << " is Leap Year" << endl; return true; } if (year % 400 == 0) { //cout << year << " is Leap Year" << endl; return true; } //cout << year << " Is Not Leap Year" << endl; return false; } int GetMonthDay(int year, int month)//--------------------获取当月天数 { int arr[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; int day = arr[month - 1];//数组是从0开始 if (month == 2 && isLeapYear(year))//闰年的2月加1天 { day += 1; } return day; } void Show()//-----------------------------------------打印函数 { cout << "日期:" << _year << "-" << _month << "-" << _day << endl; } bool operator==(const Date& d)//-------------------等号重载函数 { if (_year == d._year&&_month == d._month&&_day == d._day) { return true; } return false; } bool operator!=(const Date& d)//---------------------不等号重载函数 { return _year != d._year || _month != d._month || _day != d._day; } bool operator>=(const Date& d)//--------------------大于或等于号重载函数 { if (_year > d._year) { return true; } else if (_year == d._year) { if (_month > d._month) { return true; } else if (_month == d._month) { if (_day >= d._day) { return true; } } } return false; } bool operator<=(const Date& d)//------------------小于或等于号重载函数 { if (_year < d._year || (_year == d._year&&_month<d._month) || (_year == d._year&&_month == d._month&&_day <= d._day)) { return true; } return false; } bool operator>(const Date& d)//--------------------大于号重载函数 { if (_year > d._year || (_year == d._year&&_month>d._month) || (_year == d._year&&_month == d._month&&_day > d._day)) { return true; } return false; } bool operator<(const Date& d)//-------------------小于号重载函数 { if (_year < d._year || (_year == d._year&&_month<d._month) || (_year == d._year&&_month == d._month&&_day < d._day)) { return true; } return false; } Date operator+(int day)//------------------------加上某个天数,返回一个日期 { Date tmp = *this; tmp._day += day; if (tmp._day>GetMonthDay(tmp._year, tmp._month))//调用Get函数之前主要要考虑月份是否正确 { tmp._day -= GetMonthDay(tmp._year, tmp._month); tmp._month += 1; if (tmp._month > 12) { tmp._year += 1; tmp._month -= 12; } } return tmp; } Date& operator+=(int day)//--------------------------基本同上,返回引用 { return *this = operator+(day); } Date operator-(int day)//------------------------------减去天数,返回一个日期 { Date tmp = *this; if (day<0)//当day是负数的情况,往前倒退 { tmp._day += (-day); while (tmp._day>GetMonthDay(tmp._year, tmp._month)) { tmp._day -= GetMonthDay(tmp._year, tmp._month);//减当月的天数 if (tmp._month == 12) { tmp._year += 1; tmp._month = 1; } else { tmp._month += 1; } } return tmp; } while (day>tmp._day)//正数 { day -= tmp._day;//把当月的天数置0 tmp._month -= 1;//月份减1 if (tmp._month == 0) { tmp._year -= 1; tmp._month = 12; } tmp._day = GetMonthDay(tmp._year, tmp._month);//得到上一个月的最后一天 } tmp._day -= day; return tmp; } Date& operator-=(int day)//---------------------------------------返回引用 { *this = operator-(day); return *this; } int operator-(Date& d)//----------------------------------减去一个日期,返回相隔天数 { if (_year < d._year) { Date tmp = d; d = *this; *this = tmp; } else if (_year == d._year&&_month<d._month) { Date tmp = d; d = *this; *this = tmp; } else if (_year == d._year&&_month == d._month&&_day < d._day) { Date tmp = d; d = *this; *this = tmp; } Date tmp1(*this);//tmp1为较大值 Date tmp2(d);//tmp2为较小值 int count = 0; while (tmp1>tmp2) { tmp2.operator++(); count++; } return count; } //++d1 Date& operator++() //------------------------------------------- 前置++ { ++_day; if (_day > GetMonthDay(_year, _month)) { _day -= GetMonthDay(_year, _month); _month += 1; if (_month > 12) { _year += 1; _month = 1; } } return *this; } //d1++ Date operator++(int)//-------------------------------------- 后置 ++ { _day++; if (_day > GetMonthDay(_year, _month)) { _day -= GetMonthDay(_year, _month); _month += 1; if (_month > 12) { _year += 1; _month = 1; } } return *this; } Date operator--()//----------------------------------------前置-- { --_day; if (_day == 0) { _month--; _day = GetMonthDay(_year, _month); if (_month == 0) { _month = 12; _year -= 1; } } return *this; } Date operator--(int)//------------------------------------后置-- { _day--; if (_day == 0) { _month--; _day = GetMonthDay(_year, _month); if (_month == 0) { _month = 12; _year -= 1; } } return *this; } Date Get_year() { return _year; } Date Get_month() { return _month; } Date Get_day() { return _day; } private: int _year; int _month; int _day; };
Date.cpp
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<assert.h> #include<iostream> using namespace std; #include"Date.h" int main() { Date d(2008,12,24); Date d1(2008, 1, 2); d.operator-(-26); system("pause"); return 0; }