C++手动实现一个日期类

手动实现一个Date类进行日期的加减计算

笔者在之前的文章手动实现一个String中已经详细介绍过了关于重载和运算符重载的基本概念和要注意的事项,这是那篇文章的链接:添加链接描述
在实现这个Date类之前如果对操作运算符重载不是很熟悉的看官可以参考参考这篇文章。
在实现这个Date类之前先说明的是:在标准的系统封装好的Date类中是以1970年1月1日为起点,1970年1月1日之后的日期为正值,1970年1月1日之前的日期为负值,进而表示时间 日期类。在我们手动模拟的这个Date类中,为了方便日期计算,我们以0年0月0日为点。
下面我们开始进入正题实现我们的Date类。
首先一个Date类中我们先声明它的成员变量和成员函数:

#pragma once
#include<iostream>
#include<ostream>
#include<istream>
using namespace std;
class Date
{
public:
	//无参构造
	Date();
	//有参构造
	Date(int year,int month,int day);
	//获取Date类对象
	Date getDate();
	//返回日期加天数dates后得到的新日期
	Date operator+( int day);  
	//返回日期减天数dates后得到的新日期
	Date operator-(int day);  
	//返回两日期相差的天数
	int  operator-(Date &date);
	//重载>>运算符便于输入日期
	friend istream& operator>>(istream &is, Date &date);
	//重载<<运算符便于输出日期
	friend ostream& operator<<(ostream &os, Date &date);
	//判断是否是闰年
	bool Leap_year();
	//设置sumDate,用于对时间进行相加所需,这个参数sumDay一定要用引用或者指针类型!!!切记!!
	void sumDate(int &sumDay, int MaxMonthDay);
	//设置ReduceDate,用于对时间进行相减所需,这个参数sumDay一定要用引用或者指针类型!!!切记!!
	void ReduceDate(int &sumDay, int MaxMonthDay);
	//获取年份的总天数
	int getDays();
	//打印函数
	void showDate();
	~Date();
private:
	//年份
	int year;
	//月份
	int month;
	//一个月中的第几天
	int day;
};



private的成员变量:

//年份
int year;
//月份
int month;
//一个月中的第几天
int day;

Date():这是默认的无参构造函数,当不传参数时默认调用。

Date(int year,int month,int day):是有参构造函数,用于传进对应的参数来构造出一个Date对象

Date getDate():这是用于获取Date对象的成员函数。

Date operator+( int day):传入一个参数 int day ,返回日期加天数date后得到的新日期,比如说
Date d1(1999,5,23);d1表示一个1999年5月23日的日期对象,这时 Date d2 = d1 + 8;则表示
1999年5月23日加上8天,返回的是一个Date 对象 ,那么d2就是1999年5月31日.

Date operator-(int day):传入一个参数 int day ,返回日期加天数date后得到的新日期,比如说
Date d1(1999,5,23);d1表示一个1999年5月23日的日期对象,这时 Date d2 = d1 - 8;则表示
1999年5月23日减去8天,返回的是一个Date 对象 ,那么d2就是1999年5月15日.

int operator-(Date &date):传入一个Date对象,返回的是this这个自身Date对象和传进的date这个对象日期相差的天数。比如:Date d1(1999,5,23);Date d2(1999,5,15),当调用这个函数时,int sumdays = d1-d2;结果为 8 ,表示两个日期相隔8天,当然了,这里的 sumday是正数表示d1的时间是在d2之后,若是d1的时间是在d2之前则sumday是负数。

//重载>>运算符便于输入日期
friend istream& operator>>(istream &is, Date &date);
//重载<<运算符便于输出日期
friend ostream& operator<<(ostream &os, Date &date);
这是重写输出运算符<<和输入运算符>> 便于输入输出Date类的数据,这两个函数必须要定义为友元函数,因为这是C++强行规定的。顺便说一下,friend istream& operator>>(istream &is, Date &date)的参数Date 必须是引用。

bool Leap_year():判断是否是闰年,用于在进行日期加减运算时使用,因为我们知道,在月份中,2月是特殊的,闰年的2月份29天,非闰年的2月份28天。

void sumDate(int &sumDay, int MaxMonthDay):设置sumDate,用于对时间进行相加所需,方便多个函数来完成同一件事,这个参数sumDay一定要用引用或者指针类型!!!切记!!具体的会在实现的时候就懂了。

void ReduceDate(int &sumDay, int MaxMonthDay):设置ReduceDate,用于对时间进行相减所需,这个参数sumDay一定要用引用或者指针类型!!!切记!!
int getDays():用于获取年份的总天数,在实现int operator-(Date &date)这个函数时需要。
void showDate():这是打印函数,用于输出时间,和<<这个输出运算符重载实现的功能一样。
~Date():析构函数

下面开始对这些函数进行实现:


//无参构造器的实现
Date::Date()
{
	this->day = 0;
	this->month = 0;
	this->year = 0;
}
//有参构造器的实现
Date::Date(int year, int month, int day)
{
	this->year = year;
	this->month = month;
	this->day = day;
}

Date Date::getDate()
{
	return *this;
}
Date::~Date()
{
}

这三个函数的实现都是很简单的,可以一笔带过。顺便说一下么,由于不需要开辟空间,所以析构函数可以什么都不用写。

下面是判定闰年的实现:
当以下情况之一满足时,这一年是闰年:
年份是4的倍数而不是100的倍数;
年份是400的倍数。
其他的年份都不是闰年。具体代码如下:

bool Date::Leap_year()
{
	//判定是闰年
	if ((this->year % 4 ==0&&this->year % 100 != 0) ||this->year % 100 ==0)
	{
		return true;
	}
	else {
	return false;
	}

}

接着是:Date Date::operator+(int day)的实现

它的实现的步骤是:
先获得总月的总天数,使用do while循环,每循环一次就判定一次是否是闰年,再用switch来跳转一年十二个月中的月份来区分不同月的天数,之后调用this->sumDate(sumDay, MaxMonthDay);这个函数,我们来看看这些语句的执行意思:
if (sumDay >31)
{
//最大天数为31
this->sumDate(sumDay, 31);
}
else
{
//天数不大于31则说明不满一个月了
this->day = sumDay;
//给跳出while循环的标识符赋值
fla = true;
}

代码的执行表示是:如果这个sumDay大于这个月的最大天数31天,说明我们的月份要加1,之后sumDay就减少31天,这时候如果sumDay还是大于月份的最大天数,则继续循环,直到sumDay小于月份的最大天数,不满一个月时载跳转到语句else
{
//天数不大于31则说明不满一个月了
this->day = sumDay;
//给跳出while循环的标识符赋值
fla = true;
}这时候fla = true,表明开始结束do while循环。为了方便大家理解,笔者举个例子:

Date d1(1999,1,30);

Date d2 = d1+ 45 ;

首先 int sumDay = this->day + day = 30+45 = 75 ,
bool fla = false;
由于this->month =1;
则进入switch 的
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
//最大天数为31
if (sumDay >31)
{
this->ReduceDate(sumDay, 31);
}
else
{
this->day = sumDay;
fla = true;
}
break;

这时候1月最大天数是31, sumDay =75>31,所以执行this->ReduceDate(sumDay, 31)进入到

void Date::sumDate(int &sumDay,int MaxMonthDay)
{       
       	 //月份自增1
		 this->month++;
      //月的总天数减去这个月固定的天数
		 sumDay = sumDay - MaxMonthDay;
		 //当月份等于13时即为下一年的1月
		if (this->month == 13)
		{
			this->year++;
			this->month = 1;
		}
}

这时候,月份 this->month 由1月加1后变为2月, 即 this->month = 2;
那么sumDay 也相应地减少31天即 sumDay = sumDay - MaxMonthDay=75-31=44天,
接着由于this->month =2还没大于12未满一年,所以未执行;
if (this->month == 13)
{
this->year++;
this->month = 1;
}
,结束这个方法回到
do
{
//获取是否是闰年
bool isLeap_year = Leap_year();
switch (this->month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
//如果天数数还大于31天则继续进行
if (sumDay >31)
{
//最大天数为31
this->sumDate(sumDay, 31);
}
else
{
//天数不大于31则说明不满一个月了
this->day = sumDay;
//给跳出do while循环的标识符赋值
fla = true;
}
break;
case 4:
case 6:
case 9:
case 11:
//如果天数数还大于30天则继续进行
if (sumDay > 30)
{
//最大天数为31
this->sumDate(sumDay, 30);
}
else
{
//天数不大于30则说明不满一个月了
this->day = sumDay;
// 给跳出do while循环的标识符赋值
fla = true;
}
break;
case 2:
if (isLeap_year ==true)
{
//如果天数数还大于29天则继续进行
if (sumDay > 29)
{
//闰年2月最大天数为29
this->sumDate(sumDay, 29);
}
else
{
//天数不大于29则说明不满一个月了
this->day = sumDay;
// 给跳出do while循环的标识符赋值
fla = true;
}
}
else {
//非闰年2月最大天数为28
//如果天数数还大于28天则继续进行
if (sumDay > 28)
{
//最大天数为28
this->sumDate(sumDay, 28);
}
else
{
//天数不大于28则说明不满一个月了
this->day = sumDay;
// 给跳出do while循环的标识符赋值
fla = true;
}
}
break;
default:
break;
}

}while (!fla);

由于这个 fla还是为false,则继续循环。因为this->month = 2 ,sumDay =44(传递的是引用所以这个值也随之改变了!!!),所以进入到
if (isLeap_year ==true)
{
//如果天数数还大于29天则继续进行
if (sumDay > 29)
{
//闰年2月最大天数为29
this->sumDate(sumDay, 29);
}
else
{
//天数不大于29则说明不满一个月了
this->day = sumDay;
// 给跳出do while循环的标识符赋值
fla = true;
}
}
else {
//非闰年2月最大天数为28
//如果天数数还大于28天则继续进行
if (sumDay > 28)
{
//最大天数为28
this->sumDate(sumDay, 28);
}
else
{
//天数不大于28则说明不满一个月了
this->day = sumDay;
// 给跳出do while循环的标识符赋值
fla = true;
}
}
这时由于是非闰年,所以执行,
if (sumDay > 28)
{
//最大天数为28
this->sumDate(sumDay, 28);
}
else
{
//天数不大于28则说明不满一个月了
this->day = sumDay;
// 给跳出do while循环的标识符赋值
fla = true;
}
}
这时候由于 sumDay =44>28所以执行 if (sumDay > 28)
{
//最大天数为28
this->sumDate(sumDay, 28);
}
和上面类似,这时候,月份 this->month 由2月加1后变为3月, 即 this->month = 3;
那么sumDay 也相应地减少28天即 sumDay = sumDay - MaxMonthDay=44-28=16天,
接着由于this->month =3还没大于12未满一年,所以未执行
if (this->month == 13)
{
this->year++;
this->month = 1;
}
,结束这个方法回到,
do
{
//获取是否是闰年
bool isLeap_year = Leap_year();
switch (this->month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
//如果天数数还大于31天则继续进行
if (sumDay >31)
{
//最大天数为31
this->sumDate(sumDay, 31);
}
else
{
//天数不大于31则说明不满一个月了
this->day = sumDay;
//给跳出do while循环的标识符赋值
fla = true;
}
break;
case 4:
case 6:
case 9:
case 11:
//如果天数数还大于30天则继续进行
if (sumDay > 30)
{
//最大天数为31
this->sumDate(sumDay, 30);
}
else
{
//天数不大于30则说明不满一个月了
this->day = sumDay;
// 给跳出do while循环的标识符赋值
fla = true;
}
break;
case 2:
if (isLeap_year ==true)
{
//如果天数数还大于29天则继续进行
if (sumDay > 29)
{
//闰年2月最大天数为29
this->sumDate(sumDay, 29);
}
else
{
//天数不大于29则说明不满一个月了
this->day = sumDay;
// 给跳出do while循环的标识符赋值
fla = true;
}
}
else {
//非闰年2月最大天数为28
//如果天数数还大于28天则继续进行
if (sumDay > 28)
{
//最大天数为28
this->sumDate(sumDay, 28);
}
else
{
//天数不大于28则说明不满一个月了
this->day = sumDay;
// 给跳出do while循环的标识符赋值
fla = true;
}
}
break;
default:
break;
}
}while (!fla);
同理,继续循环,由于this->month = 3;则进入
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
//如果天数数还大于31天则继续进行
if (sumDay >31)
{
//最大天数为31
this->sumDate(sumDay, 31);
}
else
{
//天数不大于31则说明不满一个月了
this->day = sumDay;
//给跳出do while循环的标识符赋值
fla = true;
}
break;
这时候 sum = 16 <31,所以执行
this->day = sumDay;
//给跳出do while循环的标识符赋值
fla = true;
这时候 this->day = sumDay=16,fla = true;
跳出switch循环来到while(!fla);显然此时结束循环。接着返回*this本身,这个this的 数据成员为: year = 1999,month = 3,day =16;
那么我们就得到了Date d2 (1999,3,16) ;这个对象。
由以上可知,在switch中, sumDate(int &sumDay, int MaxMonthDay);这个方法里边的语句我们要使用多次,所以将它抽取出来封装成sumDate(int &sumDay, int MaxMonthDay)这个函数,体现了面向对象的封装想想。

下面是完整的实现该方法的代码:

Date Date::operator+(int day)
{

//获得月的总天数
int  sumDay = this->day + day;
//用于跳出switch循环的判断
bool fla = false;
do
{
//获取是否是闰年
bool isLeap_year = Leap_year();
switch (this->month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
	//如果天数数还大于31天则继续进行
	if (sumDay >31)
	{
	//最大天数为31
	this->sumDate(sumDay, 31);
	}
	else
	{
		//天数不大于31则说明不满一个月了
		this->day = sumDay;
		//给跳出while循环的标识符赋值
		fla = true;
	}
	break;
case 4:
case 6:
case 9:
case 11:
	//如果天数数还大于30天则继续进行
	if (sumDay > 30)
	{
		//最大天数为31
		this->sumDate(sumDay, 30);
	}
	else
	{
		//天数不大于30则说明不满一个月了
		this->day = sumDay;
		// 给跳出while循环的标识符赋值
		fla = true;
	}
	break;
case 2:
	if (isLeap_year ==true)
	{
		//如果天数数还大于29天则继续进行
		if (sumDay > 29)
		{
		//闰年2月最大天数为29
			this->sumDate(sumDay, 29);
		}
		else
		{
			//天数不大于29则说明不满一个月了
			this->day = sumDay;
			// 给跳出while循环的标识符赋值
			fla = true;
		}
	}
	else {
		//非闰年2月最大天数为28
		//如果天数数还大于28天则继续进行
		if (sumDay > 28)
		{
			//最大天数为28
			this->sumDate(sumDay, 28);
		}
		else
		{
			//天数不大于28则说明不满一个月了
			this->day = sumDay;
			// 给跳出while循环的标识符赋值
			fla = true;
		}
		}
	break;
default:
	break;
}

}while (!fla);
return *this;

}

下面开始实现
Date operator-(int day):这个日期的减法跟加法的差不多,只不过是判断的条件变了一下而已,具体的笔者就不再赘述了,直接给出源码如下:

Date Date::operator-(int day)
{
	bool fla = false;
	//获得一个月的总天数
	int  sumDay = this->day - day;
	do
	{
	//获取是否是闰年
	bool isLeap_year = Leap_year();
		switch (this->month)
		{
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:
			//最大天数为31
			if (sumDay <= 0)
			{
				this->ReduceDate(sumDay, 31);
			}
			else
			{
				this->day = sumDay;
				fla = true;
			}
			break;
		case 4:
		case 6:
		case 9:
		case 11:
			if (sumDay <= 0)
			{
				this->ReduceDate(sumDay, 30);
			}
			else
			{
				this->day = sumDay;
				fla = true;
			}
			break;
		case 2:
			if (isLeap_year == true)
			{
				//闰年2月最大天数为29
				if (sumDay <= 0)
				{
					this->ReduceDate(sumDay, 29);
				}
				else
				{
					this->day = sumDay;
					fla = true;
				}
			}
			else {
				//非闰年2月最大天数为28
				if (sumDay <= 0 )
				{
					this->ReduceDate(sumDay, 28);
				}
				else
				{
					this->day = sumDay;
					fla = true;
				}
			}
			break;
		default:
			break;
		}

	} while (!fla);
	return *this;
}

下面开始实现这个int operator-(Date & date)方法;
由于返回的是两个日期的相隔天数,所以我们可以单独将每个日期的天数先求出来,然后相减即可,所以说我们先看看获取总天数的函数:

int Date::getDays()
{
	//闰年的数量
	int count = 0;
	//总天数
	int sumDay = 0;
	//判断是否是闰年
	bool isLeap_year = Leap_year();
	for (int i = 1; i < this->year; i++)
	{
		if ((i % 4 ==0 && i % 100 != 0) ||i % 400 ==0)
		{
			count++;
		}

	}
	//获得this->year之前的年份的总天数
	sumDay = count * 366 + (this->year - count) * 365;
	//获得this->year当年月份的总天数
	for (int  i = 1; i < this->month; i++)
	{
		switch (i)
		{
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:
			sumDay += 31;
			break;
		case 4:
		case 6:
		case 9:
		case 11:
			//最大天数为30
			sumDay += 30;
			break;
		case 2:
			if (isLeap_year == true)
			{
				//闰年2月最大天数为29
				sumDay += 29;
			}
			else {
				//非闰年2月最大天数为28
				sumDay += 28;
			}
			break;
		default:
			break;
		}

	}
	//获取当月的天数
	sumDay += this->day;
	//返回总天数
	return  sumDay;
}

它的思路是,先判定闰年的个数,然后将年份分为闰年和非闰年,求得闰年和非闰年的总天数,再按月份来得到月份的天数,接着加上不足月的天数,这就得到了这个年份的总天数。
比如:1998年5月15日的总天数计算方法:
先计算从1到1998年中闰年的个数为:count =484,则非闰年的个数为: 1998-484,1998年为非闰年则月份的天数:31+28+31+30
未满一个月的天数为: 15
那么总天数就是 484*366+(1997-484)*365+( 31+28+31+30)+15

从而我们只需要返回这两年的天数差值就可以。

int Date::operator-(Date & date)
{
	//获取date的天数
	int sumDay = date.getDays();
	//返回差值天数
	return this->getDays()-sumDay;
}

最后是剩下的三个成员函数的实现,这个都是很简单的,笔者就不再赘述了,关于那个>>输入运算符的注意事项可以参考上文提到的给出的链接。我直接给出以下函数的源码:

istream & operator>>(istream & is, Date & date)
{
	cout << "请输入年:";
	is >> date.year;
	cout << endl;
	cout << "请输入月:";
	cin >> date.month;
	cout << endl;
	cout << "请输入日:";
	cin >> date.day;
	cout << endl;
	return is;
}

ostream & operator<<(ostream & os, Date & date)
{
	os << date.year << "年" << date.month << "月" << date.day << "日" << endl;
	return os;
}

到此,我们就手动实现了一个简易的Date类。

这是Date类的完整源代码,基于VS2017:

#pragma once
#include<iostream>
#include<ostream>
#include<istream>
using namespace std;
class Date
{
public:
	//无参构造
	Date();
	//有参构造
	Date(int year,int month,int day);
	//获取Date类对象
	Date getDate();
	//返回日期加天数dates后得到的新日期
	Date operator+( int day);  
	//返回日期减天数dates后得到的新日期
	Date operator-(int day);  
	//返回两日期相差的天数
	int  operator-(Date &date);
	//重载>>运算符便于输入日期
	friend istream& operator>>(istream &is, Date &date);
	//重载<<运算符便于输出日期
	friend ostream& operator<<(ostream &os, Date &date);
	//判断是否是闰年
	bool Leap_year();
	//设置sumDate,用于对时间进行相加所需,这个参数sumDay一定要用引用或者指针类型!!!切记!!
	void sumDate(int &sumDay, int MaxMonthDay);
	//设置ReduceDate,用于对时间进行相减所需,这个参数sumDay一定要用引用或者指针类型!!!切记!!
	void ReduceDate(int &sumDay, int MaxMonthDay);
	//获取年份的总天数
	int getDays();
	//打印函数
	void showDate();
	//构造函数
	~Date();
private:
	//年份
	int year;
	//月份
	int month;
	//一个月中的第几天
	int day;
};


#include "Date.h"


//无参构造器的实现
Date::Date()
{
	this->day = 0;
	this->month = 0;
	this->year = 0;
}
//有参构造器的实现
Date::Date(int year, int month, int day)
{
	this->year = year;
	this->month = month;
	this->day = day;
}

Date Date::getDate()
{
	return *this;
}

Date Date::operator+(int day)
{

	//获得月的总天数
	int  sumDay = this->day + day;
	//用于跳出do  while 循环的判断
	bool fla = false;
	do
	{
	//获取是否是闰年
	bool isLeap_year = Leap_year();
	switch (this->month)
	{
	case 1:
	case 3:
	case 5:
	case 7:
	case 8:
	case 10:
	case 12:
		//如果天数数还大于31天则继续进行
		if (sumDay >31)
		{
		//当月最大天数为31
		this->sumDate(sumDay, 31);
		}
		else
		{
			//天数不大于31则说明不满一个月了
			this->day = sumDay;
			//给跳出do  while循环的标识符赋值
			fla = true;
		}
		break;
	case 4:
	case 6:
	case 9:
	case 11:
		//如果天数数还大于30天则继续进行
		if (sumDay > 30)
		{
			//当月最大天数为30
			this->sumDate(sumDay, 30);
		}
		else
		{
			//天数不大于30则说明不满一个月了
			this->day = sumDay;
			// 给跳出do  while循环的标识符赋值
			fla = true;
		}
		break;
	case 2:
		if (isLeap_year ==true)
		{
			//如果天数数还大于29天则继续进行
			if (sumDay > 29)
			{
			//闰年2月最大天数为29
				this->sumDate(sumDay, 29);
			}
			else
			{
				//天数不大于29则说明不满一个月了
				this->day = sumDay;
				// 给跳出do  while循环的标识符赋值
				fla = true;
			}
		}
		else {
			//非闰年2月最大天数为28
			//如果天数数还大于28天则继续进行
			if (sumDay > 28)
			{
				//最大天数为28
				this->sumDate(sumDay, 28);
			}
			else
			{
				//天数不大于28则说明不满一个月了
				this->day = sumDay;
				// 给跳出do  while循环的标识符赋值
				fla = true;
			}
			}
		break;
	default:
		break;
	}

	}while (!fla);
	return *this;
}

Date Date::operator-(int day)
{
	bool fla = false;
	//获得一个月的总天数
	int  sumDay = this->day - day;
	do
	{
	//获取是否是闰年
	bool isLeap_year = Leap_year();
		switch (this->month)
		{
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:
			//最大天数为31
			if (sumDay <= 0)
			{
				this->ReduceDate(sumDay, 31);
			}
			else
			{
				this->day = sumDay;
				fla = true;
			}
			break;
		case 4:
		case 6:
		case 9:
		case 11:
			if (sumDay <= 0)
			{
				this->ReduceDate(sumDay, 30);
			}
			else
			{
				this->day = sumDay;
				fla = true;
			}
			break;
		case 2:
			if (isLeap_year == true)
			{
				//闰年2月最大天数为29
				if (sumDay <= 0)
				{
					this->ReduceDate(sumDay, 29);
				}
				else
				{
					this->day = sumDay;
					fla = true;
				}
			}
			else {
				//非闰年2月最大天数为28
				if (sumDay <= 0 )
				{
					this->ReduceDate(sumDay, 28);
				}
				else
				{
					this->day = sumDay;
					fla = true;
				}
			}
			break;
		default:
			break;
		}

	} while (!fla);
	return *this;
}

int Date::operator-(Date & date)
{
	//获取date的天数
	int sumDay = date.getDays();
	//返回差值天数
	return this->getDays()-sumDay;
}




bool Date::Leap_year()
{
	//判定是闰年
	if ((this->year % 4 ==0&&this->year % 100 != 0) ||this->year % 100 ==0)
	{
		return true;
	}
	else {
	return false;
	}

}

void Date::sumDate(int &sumDay,int MaxMonthDay)
{        
		 //月份自增1
		 this->month++;
		 //月的总天数也相应减少MaxMonthDay
		 sumDay = sumDay - MaxMonthDay;
		 //当月份等于13时即为下一年的1月
		if (this->month == 13)
		{
			this->year++;
			this->month = 1;
		}
}



void Date::ReduceDate(int & sumDay, int MaxMonthDay)
{
		    //月份自减1
	 		this->month--;
	        //月的总天数加上这个月固定的天数
            //月的总天数也相应增加MaxMonthDay
	       sumDay = sumDay + MaxMonthDay;
			//当月份等于0时即为上一年的12月
			if (this->month == 0)
			{
				this->year--;
				this->month = 12;
			}

}

int Date::getDays()
{
	//闰年的数量
	int count = 0;
	//总天数
	int sumDay = 0;
	//判断是否是闰年
	bool isLeap_year = Leap_year();
	for (int i = 1; i < this->year; i++)
	{
		//判断是否是闰年并得到闰年的个数
		if ((i % 4 ==0 && i % 100 != 0) ||i % 400 ==0)
		{
			count++;
		}

	}
	//获得this->year之前的年份的总天数
	sumDay = count * 366 + (this->year - count) * 365;
	//获得this->year当年月份的总天数
	for (int  i = 1; i < this->month; i++)
	{
		switch (i)
		{
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:
			//当月最大天数为30
			sumDay += 31;
			break;
		case 4:
		case 6:
		case 9:
		case 11:
			//当月最大天数为30
			sumDay += 30;
			break;
		case 2:
			if (isLeap_year == true)
			{
				//闰年2月最大天数为29
				sumDay += 29;
			}
			else {
				//非闰年2月最大天数为28
				sumDay += 28;
			}
			break;
		default:
			break;
		}

	}
	//获取当月的天数
	sumDay += this->day;
	//返回总天数
	return  sumDay;
}

void Date::showDate()
{
	cout << this->year << "年" << this->month << "月" << this->day << "日" << endl;
}

Date::~Date()
{
}

istream & operator>>(istream & is, Date & date)
{
	cout << "请输入年:";
	is >> date.year;
	cout << endl;
	cout << "请输入月:";
	cin >> date.month;
	cout << endl;
	cout << "请输入日:";
	cin >> date.day;
	cout << endl;
	return is;
}

ostream & operator<<(ostream & os, Date & date)
{
	os << date.year << "年" << date.month << "月" << date.day << "日" << endl;
	return os;
}

测试:

#include<iostream>
#include "Date.h"
using namespace std;
int main()
{
	Date d1(1997,5,13);
	cout << "d1:"<<d1;
	Date d2(1997, 5, 23);
	cout << "d2:" << d2;
	int sum = d1 - d2;;
	cout << "sum:" << sum << endl;
	Date d3=d1+15;
	cout << "d3:" << d3;
	 d3 = d1 - 15;
	cout << "d3:" << d3;
	Date d4;
	cin >> d4;//输入2018年2月26日
	d4.showDate();
	cout << "d1:" << d1 << "d2:" << d2;
	
	system("pause");
	return 0;

}

运行截图
在这里插入图片描述
显然这是运行正确的。

基本的内容已经实现了,有些小的细节我们还可以细化,比如说判断传进来的参数年月日是不是负数问题之类的,各位看官可以自行脑补。鄙人所实现的只是简陋的版本罢了。

最后,欢迎各位看官在底下评论斧正。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陌意随影

您的鼓励是我最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值