您的位置:首页 > 编程语言 > C语言/C++

c++日期类

2015-11-29 21:15 204 查看
用c++完成一个日期类Date,该类用于表示日期值(年、月、日),要求能实现查询n天后的日期,两个日期相差天数。

# include<iostream>
# include<assert.h>
using namespace std;

class Date
{
public:
Date(int year=1900,int month=1,int day=1)
:_year(year)
,_month(month)
,_day(day)
{
assert(year >= 1900);
assert(month > 0 && month < 13);
assert(day > 0 && day <= getMonDay(year,month));
}

int getMonDay(int year,int month)
{
assert(year >= 1900);
assert(month > 0 && month < 13);
static int ArrayDay[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int day = ArrayDay[month];
if ((IsLeapYear(year) && month == 2))
{
day += 1;
}
return day;
}
Date operator +(int day)
{
Date tmp = *this;
int monDay = 0;
while (tmp._day += day)
{
monDay = getMonDay(tmp._year,tmp._month);
if (tmp._day <= monDay)
{
break;
}
day = tmp._day - monDay;
tmp._month++;
tmp._day = 0;
if (tmp._month > 12)
{
tmp._year++;
tmp._month = 1;
}
}
return tmp;
}
Date& operator +=(int day)
{
int monDay = 0;
while (_day += day)
{
monDay = getMonDay(_year,_month);
if (_day <= monDay)
{
break;
}
day = _day - monDay;
_month++;
_day = 0;
if (_month > 12)
{
_year++;
_month = 1;
}
}
return *this;
}
Date operator -(int day)
{
Date tmp = *this;
while (day >= tmp._day)
{
tmp._month--;
day -= tmp._day;
if (day == tmp._day)
{
day = 0;
}
if (tmp._month == 0)
{
tmp._year--;
tmp._month = 12;
}
tmp._day = getMonDay(tmp._year,tmp._month);
}
tmp._day -= day;
return tmp;
}
Date& operator -=(int day)
{
while (day >= _day)
{
_month--;
day -= _day;
if (day == _day)
{
day = 0;
}
if (_month == 0)
{
_year--;
_month = 12;
}
_day = getMonDay(_year,_month);
}
_day -= day;
return *this;
}
int operator -(Date& d)
{
return (this->SumDay() - d.SumDay());
}
Date operator ++()
{
_day++;
if (_day > getMonDay(_year,_month))
{
_month++;
if (_month > 12)
{
_year++;
_month = 1;
}
_day = 1;
}
return *this;
}
Date operator ++(int )
{
Date tmp = *this;
_day++;
if (_day > getMonDay(_year,_month))
{
_month++;
if (_month > 12)
{
_year++;
_month = 1;
}
_day = 1;
}
return tmp;
}
Date& operator --()
{
_day--;
if (_day == 0)
{
_month--;
if (_month == 0)
{
_year--;
_month = 12;
}
_day = getMonDay(_year,_month);
}
return *this;
}
Date operator --(int )
{
Date tmp = *this;
_day--;
if (_day == 0)
{
_month--;
if (_month == 0)
{
_year--;
_month = 12;
}
_day = getMonDay(_year,_month);
}
return tmp;
}
int IsLeapYear(int year)
{
if ((year%400 == 0) || (year%4 == 0 && year%100 != 0))
{
return 1;
}
return 0;
}
int SumDay()
{
int sum =0;
for(int y=1;y<_year;++y)
{
sum += 365+IsLeapYear(y);
}
for(int m=1;m<_month;++m)
{
sum += getMonDay(_year,m);
}
sum += _day;
return sum;
}
void Display()
{
cout<<_year<<'-'<<_month<<'-'<<_day<<endl;
}
private:
int _year;
int _month;
int _day;
};
//测试
void Test1()
{
Date d1(2015,11,28);
Date d2(2015,1,29);
cout<<"d1:";
d1.Display();
cout<<"d1加33天:"<<endl;
Date ret = d1 + 33;
ret.Display();
cout<<"d1加等100:"<<endl;
d1 += 100;
d1.Display();
cout<<endl<<"d2:";
d2.Display();
cout<<"d2减等50天:"<<endl;
d2 -= 50;
d2.Display();
}

void Test2()
{
Date d3(2015,1,1);
Date d4(2015,3,1);
cout<<endl<<"d3:";
d3.Display();
cout<<"d4:";
d4.Display();
int ret = d4 - d3;
cout<<"相差:"<<ret<<"天"<<endl;
}

void Test3()
{
Date d5(2015,2,28);
Date d6(2016,1,1);
cout<<"d5:";
d5.Display();
cout<<"d5的明天:";
d5++;
d5.Display();
cout<<"d6:";
d6.Display();
cout<<"d6的昨天:";
d6--;
d6.Display();
}
int main()
{
Test1();
Test2();
Test3();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: