通常我们想计算某一天到另一天的距离时,要是间隔太大,我们就回去利用网上的日期计算器去算。
今天,这篇博客就是教我们如何去实现一个简单的日期计算器。
想要去实现某个功能其实并不是很难,难点在于我们综合起来地去考虑闰年或者月份的天数这块。
代码块:
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;
}