C++计算任意两日期天

      整体思路是将任意日期转换为以公元元年元旦为起点的编号日期,然后再将任意两编号日期相减。“编号思想”非常重要!

#include<iostream>
using namespace std;

class CDate//Date类声明
{
public:
	CDate(int nYear=1,int nMon=1,int nDay=1);
	int GetYear() {return m_nYear;}//获取年函数
	int GetMon() {return m_nMon;}
	int GetDay() {return m_nDay;}
	int GetNumDay() {return m_nNumDay;}//获取编号日期函数
	int IsLeapYear();//判断闰年函数,返回标识符
	int ToNumDay();//将日期编号函数
	int operator -(CDate date);//运算符-重载函数
private:
	int m_nYear,m_nMon,m_nDay;//日期年月日
	int m_nNumDay;//给日期编号,起始点为公元元年元旦为第一年
};

CDate::CDate(int nYear,int nMon,int nDay)
{
	m_nYear=nYear;
	m_nMon=nMon;
	m_nDay=nDay;
	m_nNumDay=ToNumDay();//给NumDay初始化的话,后面似乎只有调用函数ToNumDay时才能改变其值
}
int CDate::IsLeapYear()
{
	if((m_nYear%4==0&&m_nYear%100!=0)||(m_nYear%400==0))
		return 0;
	else
		return 1;
}

int CDate::ToNumDay()
{
	int nYears;//日期相差的年数
	int nMons;//日期相差的月份数
	int nDays;//日期相差的天数
	nYears=m_nYear-1;//1表示公元元年
	nMons=m_nMon-1;//1表示1月
	nDays=m_nDay-1;//1表示1日
	int nTotalMDays=0;//月份的天数累加,跟Mons有关
	int numMonDays[2][12]={{31,29,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31,31,30,31,30,31}};//
							//月份天数数组,第一行表示闰年的,第二行表示非闰年的
	int flag;
	flag=IsLeapYear();//判断闰年标志符号
	for (int i=1;i<=nMons;i++)
	{
		nTotalMDays+=numMonDays[flag][i-1];//如果是闰年,使用数组第一行累加月份天数
										   //如果非闰年,使用数组第二行累加月份天数
	}
	int nCountLeapYear=0;//闰年计数变量
	for(int j=1;j<=(m_nYear-1);j++)//计算从公元元年截止到m_nYear前一年的闰年个数
	{
		if((j%4==0)&&(j%100!=0)||(j%400==0))//四年一闰,百年不闰,四百年一闰
			nCountLeapYear++;
	}
	int nTotalYDays=365*nYears+1*nCountLeapYear;//从公元元年到m_nYear前一年的总天数
	m_nNumDay=nTotalYDays+nTotalMDays+nDays+1;//普通日期转变为编号日期
											  //跟公元元年元旦作比较
	return m_nNumDay;
}

int CDate::operator-(CDate date)
{
	int nNumDays;//两编号日期的相差天数
	nNumDays=m_nNumDay-date.GetNumDay();
	return nNumDays;
}

int main()
{
	CDate date1(2006,9,12);
	CDate date2(2005,8,8);
	int dateDiff;//两日期的相差天数
	dateDiff=date1-date2;
	cout<<date1.GetYear()<<"年"<<date1.GetMon()<<"月"<<date1.GetDay()<<"日";
	cout<<"的编号日期为第"<<date1.GetNumDay()<<"天"<<endl;
	cout<<date2.GetYear()<<"年"<<date2.GetMon()<<"月"<<date2.GetDay()<<"日";
	cout<<"的编号日期为第"<<date2.GetNumDay()<<"天"<<endl;
	cout<<date1.GetYear()<<"年"<<date1.GetMon()<<"月"<<date1.GetDay()<<"日与";
	cout<<date2.GetYear()<<"年"<<date2.GetMon()<<"月"<<date2.GetDay()<<"日";
	cout<<"相差"<<dateDiff<<"天"<<endl;
	system("pause");
	return 0;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值