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

C++ 日期计算器

2017-07-02 07:07 323 查看
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;

class Date
{
public:
Date(int year = 1900,int month = 1, int day = 1)
:_year(year)
,_month(month)
,_day(day)
{}

//拷贝构造系统默认生成

Date operator +( int day)//日期 +
{
if(day < 0)
return *this -(-day);

Date tmp(*this);
tmp._day += day;

while(Is_Invalid(tmp))
{
tmp._day -= GetMonthDay(tmp._year, tmp._month);
tmp._month++;
if(tmp._month == 13)
{
tmp._year++;
tmp._month = 1;
}
}
return tmp;
}

Date& operator +=(int day)//日期 +=
{
*this = *this + day;
return *this;
}

Date operator -( int day)//日期 -
{
if(day < 0)
return *this +(-day);

Date tmp(*this);
tmp._day -= day;

while(Is_Invalid(tmp))
{
tmp._month--;

if(tmp._month == 0)
{
tmp._year--;
tmp._month = 12;
}

tmp._day += GetMonthDay(tmp._year, tmp._month);
}
return tmp;
}

Date& operator -=(int day)//日期 -=
{
*this = *this - day;
return *this;
}

bool operator ==(const Date& d)//判断日期相等
{
return (_day == d._day)\
&&(_month == d._month)\
&&(_year == d._year);
}

bool operator !=(const Date& d)//判断日期不等
{
return (_day != d._day)\
||(_month != d._month)\
||(_year != d._year);
}

int operator -(const Date& d)//日期相减相差的天数
{
Date min = *this;
Date max = d;

if(min._year > max._year)//用较小日期逼近较大日期
{
min = d;
max = *this;
}
else if(min._year == max._year)
{
if(min._month > max._month)
{
min = d;
max = *this;
}
else if(min._month == max._month)
{
if(min._day > max._year)
{
min = d;
max = *this;
}
}
}

int count = 0;
while(min != max)
{
min = min+1;
count++;
}
return count;

//Date tmp1(1900, 1, 1);//一某年为基准,求两个日期和它的相差的天数再求差
//int num1 = 0;
//while(min != tmp1)
//{
// tmp1 = tmp1 + 1;
// num1++;
//}
//Date tmp2(1900, 1, 1);
//int num2 = 0;
//while(max != tmp2)
//{
// tmp2 = tmp2 + 1;
// num2++;
//}
//int count = num1 - num2;
//return count;
}

bool Is_Bissextile(int year)//判断闰年
{
if(((year%4 == 0)&&(year%100 != 0)) || (year%400 == 0))
return true;
else
return false;
}

int GetMonthDay(int year, int month)//获得某年某月的天数
{
int Day[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if(Is_Bissextile(year))
{
if(month == 2)
{
return Day[month] + 1;
}
else
return Day[month];
}
else
return Day[month];
}

bool Is_Invalid(const Date &d)//判断日期是否无效
{
int get_day = GetMonthDay(d._year, d._month);

if((d._day > get_day) || (d._day < 1)\
||(d._month > 12) || (d._month < 1))
return true;
else
return false;
}

void Display()
{
cout<<_year<<"-"<<_month<<"-"<<_day<<endl;
}

private:
int _year;
int _month;
int _day;
};

void test()//测试用例
{
Date d1(2017, 7, 1);

Date d2 = d1 - 100;
d2.Display();

Date d3 = d1 - (-100);
d3.Display();

Date d4 = d1 + 100;
d4.Display();

Date d5 = d1 + (-100);
d5.Display();

Date d6 = d1 += 100;
d6.Display();

Date d7 = d1 -= 100;
d7.Display();

Date d8(2017, 7, 1);
Date d9(2017, 9, 10);
Date d10(2017, 7, 1);

cout<<(d8==d9)<<endl;
cout<<(d8!=d9)<<endl;
cout<<"两个日期相差:"<<(d8-d9)<<endl;
cout<<"两个日期相差:"<<(d9-d10)<<endl;
}

int main()
{
test();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: