整体思路是将任意日期转换为以公元元年元旦为起点的编号日期,然后再将任意两编号日期相减。“编号思想”非常重要!
#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;
}