对日期我们一般会有以下四种运算:
1、给日期加一个天数判断这一天的日期
2、给日期减一个天数判断这一天的日期
3、两个日期相加,得到一个新的日期
4、两个日期相减,得到一个新的日期,并判断相差天数
下面代码实现
设置一个固定数组month_days[],用来保存每个月的天数
const int month_days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
定义日期类
运算操作在类内实现(也可在类外)
class Date
{
public:
Date(int year=0,int month=0,int day=0)
{
_year=year;
_month=month;
_day=day;
}
Date(Date& p)
{
_year=p._year;
_month=p._month;
_day=p._day;
}
//~Date();
void Set_date(int y,int m,int d);
int Leap_year();
void Print();
int Sum_days();
void operator+(const int days)
{
_day+=days;
while(_day>=365)
{
if(Leap_year()&&_day>365)
{
_year++;
_day-=366;
}
else
{
_year++;
_day-=365;
}
}
while(_day>31)
{
switch(_month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
{
_month++;
_day-=31;
break;
}
case 4:
case 6:
case 9:
case 11:
{
_month++;
_day-=30;
break;
}
case 2:
{
if(Leap_year())
{
_month++;
_day-=29;
break;
}
else
{
_month++;
_day-=28;
break;
}
}
if(_month>12)
{
_year++;
_month-=12;
}
}
}
}
void operator-(const int days)
{
_day-=days;
while(_day<=0)
{
switch(_month-1)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
{
_month--;
_day+=31;
break;
}
case 4:
case 6:
case 9:
case 11:
{
_month--;
_day+=30;
break;
}
case 2:
{
if(Leap_year())
{
_month--;
_day+=29;
break;
}
else
{
_month--;
_day+=28;
break;
}
}
if(_month<1)
{
_year--;
_month+=12;
}
}
}
}
Date operator+(const Date& c)
{
_year+=c._year;
_month+=c._month;
_day+=c._day;
while(_day>=365)
{
if(Leap_year()&&_day>365)
{
_year++;
_day-=366;
}
else
{
_year++;
_day-=365;
}
}
if(_month>12)
{
_year++;
_month-=12;
}
while(_day>31)
{
switch(_month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
{
_month++;
_day-=31;
break;
}
case 4:
case 6:
case 9:
case 11:
{
_month++;
_day-=30;
break;
}
case 2:
{
if(Leap_year())
{
_month++;
_day-=29;
break;
}
else
{
_month++;
_day-=28;
break;
}
}
}
}
return *this;
}
Date operator-(const Date& c)
{
_year-=c._year;
_month-=c._month;
_day-=c._day;
if(_month<0)
{
_year--;
_month+=12;
}
while(_day<=0)
{
switch(_month-1)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
{
_month--;
_day+=31;
break;
}
case 4:
case 6:
case 9:
case 11:
{
_month--;
_day+=30;
break;
}
case 2:
{
if(Leap_year())
{
_month--;
_day+=29;
break;
}
else
{
_month--;
_day+=28;
break;
}
}
}
}
return *this;
}
private:
int _year;
int _month;
int _day;
};
void Date::Set_date(int year,int month,int day)
{
_year=year;
_month=month;
_day=day;
}
其他函数在类外实现(为了验证函数可写在类内也可写在类外)
void Date::Set_date(int year,int month,int day)
{
_year=year;
_month=month;
_day=day;
}
int Date::Leap_year()
{
return ((_year%4==0&&_year%100!=0)||(_year%400==0));
}
void Date::Print()
{
cout<<"("<<_year<<","<<_month<<","<<_day<<")"<<endl;
}
int Date::Sum_days()
{
int sum=0;
for(int i=1;i<_month;i++)
sum=sum+month_days[i];
int k=_year/4;
if(Leap_year()&&_month>2)
return _year*365+sum+_day+k;
else
return _year*365+sum+_day;
}
测试函数
void test1()
{
Date d1(2016,7,19);
Date d2(2016,7,5);
cout<<"原始日期数据为"<<endl;
d1.Print();
d2.Print();
d1.operator+(100);
cout<<"加上测试数后的结果为"<<endl;
d1.Print();
d2.operator-(100);
cout<<"减去测试数字后的结果为:"<<endl;
d2.Print();
}
void test2()
{
Date d1(2015,8,8);
Date d2(2013,7,5);
Date d3;
cout<<"原始日期数据为"<<endl;
d1.Print();
d2.Print();
d3=d1+d2;
cout<<"这两个日期相加为:"<<endl;
d3.Print();
Date d4(2013,7,31);
Date d5(2009,4,5);
Date d6;
cout<<"原始日期数据为"<<endl;
d4.Print();
d5.Print();
d6=d4-d5;
cout<<"这两个日期相减为:"<<endl;
d6.Print();
cout<<"这两天相差"<<d6.Sum_days()<<"天"<<endl;
}
main函数
int main()
{
test1();
test2();
system("pause");
return 0;
}
测试结果如下面所示
附所有源代码
const int month_days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
#include<iostream>
#include<cstdio>
using namespace std;
class Date
{
public:
Date(int year=0,int month=0,int day=0)
{
_year=year;
_month=month;
_day=day;
}
Date(Date& p)
{
_year=p._year;
_month=p._month;
_day=p._day;
}
//~Date();
void Set_date(int y,int m,int d);
int Leap_year();
void Print();
int Sum_days();
void operator+(const int days)
{
_day+=days;
while(_day>=365)
{
if(Leap_year()&&_day>365)
{
_year++;
_day-=366;
}
else
{
_year++;
_day-=365;
}
}
while(_day>31)
{
switch(_month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
{
_month++;
_day-=31;
break;
}
case 4:
case 6:
case 9:
case 11:
{
_month++;
_day-=30;
break;
}
case 2:
{
if(Leap_year())
{
_month++;
_day-=29;
break;
}
else
{
_month++;
_day-=28;
break;
}
}
if(_month>12)
{
_year++;
_month-=12;
}
}
}
}
void operator-(const int days)
{
_day-=days;
while(_day<=0)
{
switch(_month-1)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
{
_month--;
_day+=31;
break;
}
case 4:
case 6:
case 9:
case 11:
{
_month--;
_day+=30;
break;
}
case 2:
{
if(Leap_year())
{
_month--;
_day+=29;
break;
}
else
{
_month--;
_day+=28;
break;
}
}
if(_month<1)
{
_year--;
_month+=12;
}
}
}
}
Date operator+(const Date& c)
{
_year+=c._year;
_month+=c._month;
_day+=c._day;
while(_day>=365)
{
if(Leap_year()&&_day>365)
{
_year++;
_day-=366;
}
else
{
_year++;
_day-=365;
}
}
if(_month>12)
{
_year++;
_month-=12;
}
while(_day>31)
{
switch(_month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
{
_month++;
_day-=31;
break;
}
case 4:
case 6:
case 9:
case 11:
{
_month++;
_day-=30;
break;
}
case 2:
{
if(Leap_year())
{
_month++;
_day-=29;
break;
}
else
{
_month++;
_day-=28;
break;
}
}
}
}
return *this;
}
Date operator-(const Date& c)
{
_year-=c._year;
_month-=c._month;
_day-=c._day;
if(_month<0)
{
_year--;
_month+=12;
}
while(_day<=0)
{
switch(_month-1)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
{
_month--;
_day+=31;
break;
}
case 4:
case 6:
case 9:
case 11:
{
_month--;
_day+=30;
break;
}
case 2:
{
if(Leap_year())
{
_month--;
_day+=29;
break;
}
else
{
_month--;
_day+=28;
break;
}
}
}
}
return *this;
}
private:
int _year;
int _month;
int _day;
};
void Date::Set_date(int year,int month,int day)
{
_year=year;
_month=month;
_day=day;
}
int Date::Leap_year()
{
return ((_year%4==0&&_year%100!=0)||(_year%400==0));
}
void Date::Print()
{
cout<<"("<<_year<<","<<_month<<","<<_day<<")"<<endl;
}
int Date::Sum_days()
{
int sum=0;
for(int i=1;i<_month;i++)
sum=sum+month_days[i];
int k=_year/4;
if(Leap_year()&&_month>2)
return _year*365+sum+_day+k;
else
return _year*365+sum+_day;
}
void test1()
{
Date d1(2016,7,19);
Date d2(2016,7,5);
cout<<"原始日期数据为"<<endl;
d1.Print();
d2.Print();
d1.operator+(100);
cout<<"加上测试数后的结果为"<<endl;
d1.Print();
d2.operator-(100);
cout<<"减去测试数字后的结果为:"<<endl;
d2.Print();
}
void test2()
{
Date d1(2015,8,8);
Date d2(2013,7,5);
Date d3;
cout<<"原始日期数据为"<<endl;
d1.Print();
d2.Print();
d3=d1+d2;
cout<<"这两个日期相加为:"<<endl;
d3.Print();
Date d4(2013,7,31);
Date d5(2009,4,5);
Date d6;
cout<<"原始日期数据为"<<endl;
d4.Print();
d5.Print();
d6=d4-d5;
cout<<"这两个日期相减为:"<<endl;
d6.Print();
cout<<"这两天相差"<<d6.Sum_days()<<"天"<<endl;
}
int main()
{
test1();
test2();
system("pause");
return 0;
}
谢谢浏览