码迷,mamicode.com
首页 > 其他好文 > 详细

日期类

时间:2015-11-15 19:17:09      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:日期类

给天数算到哪年哪月

给那个日期对象求差值

注意构造函数的有效参数判断

#pragma once
#include<iostream>
using namespace std;
class Date
{
private:
	int _year;
	int _month;
	int _day;
public:
	//默认成员函数
	Date(int year = 1990, int month = 1, int day = 1);//缺省构造函数
	Date(const Date& c);//拷贝构造函数
	Date& operator=(const Date& c);//赋值操作符重载
	~Date();//析构函数
	
	void display();
	Date AddDay(int day);
	int SubDate(const Date& d);
	bool operator<(const Date& d);
};
#include"Date.h"
Date::Date(int year, int month, int day)
{
	if (year<1900)
	{
		cout << "year error" << endl;
		return;
	}
	if (month <1 && month > 12)
	{
		cout << "month error" << endl;
		return;
	}
	switch (month)
	{
	case 2:
		if ((year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0)))//瑞年2月有29天
		{
			if (day<1 || day>29)
			{
				printf("day error\n");
				return;
			}
		}
		else
		{
			if (day<1 || day>28)//非瑞年2月有28天
			{
				printf("day error\n");
				return;
			}
		}
		break;
	case 1:
	case 3:
	case 5:
	case 7:
	case 8:
	case 10:
	case 12:
		if (day<1 || day>31)//1,3,5,7,8,10,12月为31天
		{
			cout << "day error" << endl;
		}
		break;
	default:
		if (day<1 || day>30)//其他月为30天
		{
			cout << "day error" << endl;
		}
		break;
	}
	//已确认日期有效
	_year = year;
	_month = month;
	_day = day;
}
Date::Date(const Date& c)
{
	_year = c._year;
	_month = c._month;
	_day = c._day;
}
Date& Date::operator=(const Date& c)//&表引用
{
	if (this != &c)//&表取地址
	{
		_year = c._year;
		_month = c._month;
		_day = c._day;
	}
	return *this;
}
Date:: ~Date()
{
	cout << "析构函数" << endl;
}
void Date::display()
{
	cout << _year << "-" << _month << "-" << _day << endl;
}
int months[12] = { 31,29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };//平年存储月份天数
Date Date:: AddDay(int day)
{
	//瑞年366天,平年365天
	int curYear = _year;
	int curMonth = _month;
	int curDay = _day;
	int leftDay;
	if (day == 0)
		return *this;
	else if (day > 0)
	{
		while (1)
		{
			if (curMonth == 2)
			{
				if ((curYear % 400 == 0) || (curYear % 4 == 0 && curYear % 100 != 0))
					leftDay = 29;
				else
					leftDay = 28;
			}
			else
				leftDay = months[curMonth - 1];
			if (day <= leftDay)
			{
				curDay += day;
				break;
			}
			else
			{
				day -= leftDay - curDay;
				if (curMonth == 12 && day > 0)
				{
					++curYear;
					curMonth = 1;
				}
				else
					curMonth += 1;
				curDay = 0;
			}
		}
	}
	else
	{
		day = -day;
		while (1)
		{
			
			if (day <= curDay)
			{
				curDay -= day;
				break;
			}
			else
			{
				day -=curDay;
				if (curMonth == 1 && day > 0)
				{
					--curYear;
					curMonth = 12;
				}
				else
					curMonth -= 1;
			}
			if (curMonth == 2)
			{
				if ((curYear % 400 == 0) || (curYear % 4 == 0 && curYear % 100 != 0))
					curDay = 29;
				else
					curDay = 28;
			}
			else
				curDay = months[curMonth - 1];
	}
		
	}
	Date tmp(curYear, curMonth, curDay);
		return tmp;
}
int  Date::SubDate(const Date& d)
{
	int retDay = 0;
	int flag = 1;
	Date d1(*this);
	Date d2(d);
	if (!(*this < d))
	{
		d1 = d;
		d2 = *this;
		flag = -1;
	}
	int lefYear = d2._year;
	int lefMonth = d2._month;
	int leftDay = d2._day;
	while (1)
	{
		if (d1._year == lefYear && (d1._month == lefMonth))
		{
			retDay += leftDay -d1. _day;
			break;
		}
		else
		{
			retDay += leftDay;
			if (lefMonth == 1)
			{
				--lefYear;
				lefMonth = 12;
			}
			else
				--lefMonth;
		}
		if (lefMonth == 2)
		{
			if ((lefYear % 400 == 0) || (lefYear % 4 == 0 && lefYear % 100 != 0))
				leftDay = 29;
			else
				leftDay = 28;
		}
		else
			leftDay = months[lefMonth - 1];
	}
	return retDay*flag;
}
bool Date::operator<(const Date& d)
{
	if (_year<d._year)
	{
		 if (_month < d._month)
		 {
			if (_day < d._day)
			{
				return true;
			}
			else
				return false;
		 }
		 else
			return false;
	}
	else
	{
		return false;
	}
}
#include<iostream>
#include"Date.h"
using namespace std;
void Test1()
{
	Date d1(2012,4,10);
	d1.display();
	Date d2(d1.AddDay(-30));
	d2.display();
	//int ret = d2.SubDate(d1);
	//cout << ret <<endl;
	//Date d3(2015, 2, 3);
	//cout << (d1 < d3) << endl;
}
int main()
{
	Test1();
	system("pause");
	return 0;
}


本文出自 “小止” 博客,请务必保留此出处http://10541556.blog.51cto.com/10531556/1712925

日期类

标签:日期类

原文地址:http://10541556.blog.51cto.com/10531556/1712925

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!