实现日期加减天数,得到一个日期;日期减日期,得到一个天数。
<span style="font-size:18px;">#include<iostream>
#include<cstring>
#include<iomanip>
using namespace std;
//添加打印指定月的信息,一个月的每一天和对应
enum
{
zero,
one,
tow,
three
};
class Date
{
public:
Date(int year = 2016, int month = 7, int day = 20, int week = 3) :_year(year)
, _month(month)
, _day(day)
, _week(week)
{
}
Date operator+ (int day);
Date operator- (int day);
int operator- (const Date& d);
void display()const;
friend int bissextile(const Date&, const Date&);
friend istream& operator>>(istream& is, Date& d);
int count() const;
//private:
int _year;
int _month;
int _day;
int _week;
static int month[12];
};
int Date::month[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int Date::count() const //计算从当前年份开始到当前日期已经过了多少天
{
int i = 0;
int sum = 0;
for (i = 0; i <_month - 1; i++)
{
sum += month[i];
}
return sum + _day;
}
int bissextile(const Date& d1, const Date& d2) //判断两个日期之间有多少个闰年
{
int i = 0;
int j = 0;
if (d1._month>2)
{
i = d1._year;
}
else
{
i = d1._year - 1;
}
if (d2._month <= 2)
{
j = d2._year;
}
else
{
j = d2._year + 1;
}
int sum = 0;
for (; i >= j; i--)
{
if (((i % 4 == 0) && (i % 100 != 0)) || (i % 400 == 0))
{
sum++;
}
}
return sum;
}
Date Date::operator+ (int day) //日期加天数
{
Date tmp = *this;
_week = (_week + day - 1) % 7 + 1; //求出这一天对应的星期
_year += (day / 365);
day = day % 365;
if (day - (month[_month - 1] - _day)>0)
{
day -= (month[_month - 1] - _day);
_day = 0;
}
else
{
_day += day;
return *this;
}
for (int i = _month; day >month[i % 12]; i++)
{
day -= month[i % 12];
_month++;
}
_year += (_month / 12);
_month = _month % 12 + 1;
_day = day;
return *this;
}
Date Date::operator- (int day) //日期减天数
{
int d = day % 7;
if (_week >d)
{
_week = _week - d;
}
else
{
_week = 7 - (d - _week);
}
Date tmp = *this;
_year -= (day / 365);
day = day % 365;
if (day - _day >= 0)
{
day -= _day;
_month--;
if (_month == 0)
{
_year--;
_month = 12;
}
_day = 0;
}
else
{
_day -= day;
return *this;
}
for (int i = _month - 1; day - month[i] >= 0; i--)
{
day -= month[i];
_month--;
if (_month == 0)
{
_year--;
_month = 12;
}
if (i == 0)
{
i = 12;
}
}
_day = month[_month - 1] - day;
return *this;
}
int Date::operator- (const Date& d) //日期-日期
{
int sum = 0;
sum = bissextile(*this, d); //判断两个日期之间有多少个闰年
return (_year - d._year) * 365 + (*this).count() - d.count() + sum;
}
void Date::display()const
{
int i = 0;
int j = 0;
int d = _day - 1;
int week = _week;
d = d % 7;
if (week >d)
{
week = week - d;
}
else
{
week = 7 - (d - week);
}
cout << " " << _year << "年" << _month << "月" << _day << "日" << "星期" << _week << endl;
cout << " 日 " << " 一 " << " 二 " << " 三 " << " 四 " << " 五 " << " 六 " << endl;
for (i = 0; i < (week % 7); i++)
{
cout << setw(4) << " ";
}
j = month[_month - 1];
if ((((_year % 4 == 0) && (_year % 100 != 0)) || (_year % 400 == 0)) && _month == 2)
{
j++;
}
for (i = 0; i <j; i++)
{
week++;
cout << setw(4) << setiosflags(ios::right) << (i + 1);
if (week % 7 == 0)
{
cout << endl;
}
}
cout << endl;
}
istream& operator>>(istream& is, Date& d)
{
is >> d._year >> d._month >> d._day >> d._week;
return is;
}
void test1()
{
Date d1;
Date d2;
int day = 0;
cout << "input>:日期" << endl;
cin >> d1;
cout << "input>:天数" << endl;
cin >> day;
d2 = d1 + day;
int sum = bissextile(d1, d2);
d2 = d2 - sum;
d2.display();
}
void test2()
{
Date d1;
Date d2;
Date d3;
int day = 0;
cout << "input>:日期" << endl;
cin >> d1;
cout << "input>:天数" << endl;
cin >> day;
d3 = d1;
d2 = d1 - day;
int sum = bissextile(d3, d2);
d2 = d2+sum;
d2.display();
}
void test3()
{
Date d1;
Date d2;
cout << "input>:日期" << endl;
cin >> d1;
cout << "input>:日期" << endl;
cin >> d2;
int day=0;
day = d1 - d2;
cout << "相差"<<day<<"天" << endl;
}
void menu()
{
int n;
while (1)
{
cout << " 0.exit"<<" 1.日期加天数" << " 2.日期减天数" << " 3.日期减日期" << endl << endl;;
cout <<"请选择:";
cin >> n;
switch (n)
{
case zero:
exit(1);
break;
case one:
test1();
break;
case tow:
test2();
break;
case three:
test3();
break;
default:
cout << "输入不合法" << endl;
}
}
}
int main()
{
menu();
system("pause");
return 0;
}</span><span style="font-size:32px;">
</span>