c++ 日期类

#pragma once //头文件

class Date{

private:
	int _year;
	int _month;
	int _day;

public:
	Date(int year=1990,int month=1,int day=1);
	Date(const Date& tmp);
    ~Date();
	int operator-(const Date& tmp);//日期相减
	Date operator+(int day);//日期与天数相加
	Date& operator++();//日期与天数相加
	Date& operator+=(int day);//日期与天数相加

	Date operator-(int day);//日期与天数相减
	bool operator>(const Date& tmp);//日期比较
	bool operator==(const Date& tmp);//日期是否相等

	void PrintDate();//打印日期
	bool IsleapYear(const Date& tmp);//是否闰年
	bool IsOverDay(const Date& tmp);//是否超过1个月的天数
	bool IsOverMonth(const Date& tmp);//是否超过1年的月数
};

#include<iostream>//函数文件
#include "date.h"

using namespace std;

Date::Date(int year,int month,int day)
{
    _year=year;
	_month=month;
	_day=day;
	if(year<1990||month<1||IsOverMonth(*this)||day<1||IsOverDay(*this))
	{
		cout<<"无效的日期"<<endl;
		exit(-1);
	}
}

Date::Date(const Date& tmp)
{
	_year=tmp._year;
	_month=tmp._month;
	_day=tmp._day;
}

Date::~Date()
{

}
int Date::operator-(const Date& tmp)//基本实现日期相减 (复杂逻辑)
{
	Date dateTmp;
	int count=0 ;
	int tmpCount=0;
	if(tmp._year-_year==0)
	{
		dateTmp._month=(_month<tmp._month)? _month:tmp._month;
		dateTmp._day=0;
		int maxDay=_month>tmp._month?_day:tmp._day;
		while(dateTmp._month!=(_month>tmp._month? _month:tmp._month)||
			dateTmp._day!=maxDay)
		{

			if(dateTmp._month!=(_month>tmp._month? _month:tmp._month))
			{
				if(dateTmp._month==1||dateTmp._month==3||dateTmp._month==5
					||dateTmp._month==7
				||dateTmp._month==8||dateTmp._month==10||dateTmp._month==12)
				{
					count+=31;
					++dateTmp._month;
				}
				else if(dateTmp._month==2)
				{
					if(IsleapYear(tmp))
					{
						count+=29;
						++dateTmp._month;
					}
					else
					{
						count+=28;
						++dateTmp._month;
					}
				}
				else 
				{
					count+=30;
					++dateTmp._month;
				}
			}
			else
			{
				++dateTmp._day;
				++count ;
			}
		}
		return count-(_month>tmp._month?_day:tmp._day);
	}
	else
	{
		dateTmp._year=(_year<dateTmp._year)? _year:tmp._year;
		dateTmp._month=1;
		dateTmp._day=0;
		int maxDay=(_year>tmp._year?_day:tmp._day);
		int tmpCount=0;
		while((dateTmp._year!=(_year>tmp._year? _year:tmp._year))||
			(dateTmp._month!=(_year>tmp._year? _month:tmp._month))||
			(dateTmp._day!=maxDay))
		{
			if(dateTmp._year!=(_year>tmp._year? _year:tmp._year))
			{
				if(IsleapYear(dateTmp))
				{
					count+=366;
					++dateTmp._year;
				}
				else
				{
					count+=365;
					++dateTmp._year;
				}
			}

			else if(dateTmp._month!=(_year>tmp._year? _month:tmp._month))
			{
				if(dateTmp._month==1||dateTmp._month==3||dateTmp._month==5
					||dateTmp._month==7
					||dateTmp._month==8||dateTmp._month==10||dateTmp._month==12)
				{
					count+=31;
					++dateTmp._month;
				}
				else if(dateTmp._month==2)
				{
					if(IsleapYear(tmp))
					{
						count+=29;
						++dateTmp._month;
					}
					else
					{
						count+=28;
						++dateTmp._month;
					}
				}
				else 
				{
					count+=30;
					++dateTmp._month;
				}
			}
			else
			{
				++count ;
				++dateTmp._day;
			}
		}
		dateTmp._month=1;
		dateTmp._day=0;
		maxDay=_year<tmp._year?_day:tmp._day;
		while(dateTmp._month!=(_year<tmp._year? _month:tmp._month)||
			dateTmp._day!=maxDay)
		{

			if(dateTmp._month!=(_year<tmp._year? _month:tmp._month))
			{
				if(dateTmp._month==1||dateTmp._month==3||dateTmp._month==5
					||dateTmp._month==7
					||dateTmp._month==8||dateTmp._month==10||dateTmp._month==12)
				{
					tmpCount+=31;
					++dateTmp._month;
				}
				else if(dateTmp._month==2)
				{
					if(IsleapYear(dateTmp))
					{
						tmpCount+=29;
						++dateTmp._month;
					}
					else
					{
						tmpCount+=28;
						++dateTmp._month;
					}
				}
				else 
				{
					tmpCount+=30;
					++dateTmp._month;
				}
			}
			else
			{
				++dateTmp._day;
				++tmpCount ;
			}
		}
		return count-tmpCount;
	}
}
int Date::operator-(const Date& tmp)//日期相减  (与上个函数体 重复)
{
//利用其它 类的成员函数  简单实现日期相减
	int count=0;
	if(*this>tmp)
	{
		Date dateTmp(tmp);
		while(1)
		{
			if (dateTmp == *this)
				return count;
			if ((++dateTmp) == *this)
			{
				count++;
				return count;
			}
			count++;
		}
	}
	else
	{
		Date dateTmp(*this);
		while(1)
		{
			if (dateTmp == *this)
				return count;
			if ((++dateTmp) == *this)
			{
				count++;
				return count;
			}
			count++;
		}

	}
  
}

Date Date::operator+(int day)//日期与天数相加
{
	Date tmp(*this);
	int count=0;
	while(count!=day)
	{
		++tmp._day;
		if(IsOverDay(tmp))
		{
			++tmp._month;
			if(IsOverMonth(tmp))
			{
				++tmp._year;
				tmp._month=1;
			}
			tmp._day=1;
		}
		count++;
	}
	return tmp;
}
Date Date::operator-(int day)//日期与天数相减
{
	Date tmp(*this);
	int count=0;
	while(count!=day)
	{
		--tmp._day;
		if(tmp._day==0)
		{
			--tmp._month;
			if(tmp._month==0)
			{
				--tmp._year;
				tmp._month=12;
			}
			if(tmp._month==1||tmp._month==3||tmp._month==5||tmp._month==7
				||tmp._month==8||tmp._month==10||tmp._month==12)
			{	

				tmp._day=31;
			}
			else if(tmp._month==2)
			{
				if(IsleapYear(tmp))
					tmp._day=29;
				else
					tmp._day=28;
			}
			else 
				tmp._day=30;

		}
		count++;
	}
	return tmp;

}

bool Date::IsleapYear(const Date& tmp)//是否闰年
{
	return ((tmp._year%4==0&&tmp._year%100!=0)||(tmp._year%400==0));
}

bool Date::IsOverDay(const Date& tmp)//是否超过1个月的天数
{
	if(tmp._month==1||tmp._month==3||tmp._month==5||tmp._month==7
		||tmp._month==8||tmp._month==10||tmp._month==12)
	{	

			return tmp._day>31;
	}
	else if(tmp._month==2)
	{
		 if(IsleapYear(tmp))
			 return tmp._day>29;
		 else
			 return tmp._day>28;
	}
	else 
		return tmp._day>30;

}

bool Date::IsOverMonth(const Date& tmp)//是否超过12个月的
{
	return tmp._month>12;
}
void Date::PrintDate()
{
	cout<<_year<<"年"<<_month<<"月"<<_day<<"日"<<endl;
}

bool Date::operator>(const Date& tmp)//日期比较
{
	return (_year>=tmp._year)&&(_month)>=(tmp._month)&&(_day>=tmp._day);
}

bool Date::operator==(const Date& tmp)
{
	return ((_year==tmp._year)&&(_month==tmp._month)&&(_day==tmp._day));

}
Date& Date::operator++()//日期与天数相加  前置++
{
	int count = 0;
	while (count != 1)
	{
		++(this->_day);
		if (IsOverDay(*this))
		{
			++(this->_month);
			if (IsOverMonth(*this))
			{
				++(this->_year);
				this->_month = 1;
			}
			this->_day = 1;
		}
		count++;
	}
	return *this;
}

Date& Date::operator+=(int day)//日期与天数相加
{

	int count = 0;
	while (count != day)
	{
		++(this->_day);
		if (IsOverDay(*this))
		{
			++(this->_month);
			if (IsOverMonth(*this))
			{
				++(this->_year);
				this->_month = 1;
			}
			this->_day = 1;
		}
		count++;
	}
	return *this;
}

//主函数测试文件

#include<iostream>
#include "date.h"
using namespace std;

void test()
{
	Date d1(2010,1,1);
	Date d2(2010,1,1);

	//(d2-35).PrintDate();
	//(d2 +1).PrintDate();
	//(++d2).PrintDate();
	//(d1 += 100).PrintDate();
	//cout<<(d2>d1)<<endl;
	cout<<d1-d2<<endl;
}

int main()
{
	test();

	return 0;
}
时间: 2024-11-05 12:35:37

c++ 日期类的相关文章

日期类 Date

import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; /* 日期类 Date Calendar 日期格式化类 SimpleDateFormat */ public class Demo3 { public static void main(String[] args) throws ParseException {

day17 包装类、日期类

包装类 作用:1.丰富了基本数据类型只能存放值的问题,还提供了大量的方法或常量. 2.包装类充当了基本数据类型和引用数据类型转换的桥梁. 应用层面:包装类.String.基本数据类型的互相转换. 1.基本数据类型转为String: String str = Integer.toString(10): String str = 10 + "": 2.String转换为基本数据类型: int i = Integer.parseInt(str): 3.基本数据类型和包装类互转换: 语法糖--

利用java日期类生成数据仓库维度表

利用java日期类生成数据仓库维度表 Date类: 最基础的日期时间类,返回一个相对日期的毫秒数.精确到毫秒,但不支持日期的国际化和分时区显示.Date 类从Java 开发包(JDK)1.0 就开始进化,当时它只包含了几个取得或者设置一个日期数据的各个部分的方法, 比如说月, 日, 和年. 这些方法现在遭到了批评并且已经被转移到了Calendar类里去了,这种改进旨在更好的处理日期数据的国际化格式. Calender类: 相对于Date更加强大的时间类,是抽象类,提供了常规的日期修改功能和国际化

Problem B: 时间和日期类(III)

Problem B: 时间和日期类(III) Time Limit: 4 Sec  Memory Limit: 128 MBSubmit: 2889  Solved: 1732[Submit][Status][Web Board] Description 设计一个日期时间类,用于读取输入的数据,按格式输出日期和时间. 设计日期时间类DateTime由2个成员组成,分别是一个Date类对象和一个Time类对象: 设计DateTime类需支持以下操作: DateTime::DateTime()无参构

Java:日历类、日期类、数学类、运行时类、随机类、系统类

一:Calendar类 java.util 抽象类Calendar   1.static Calendar getInstance()使用默认时区和语言环境获得一个日历. 2. int get(int field) 返回给定日历字段的值. java.lang.Object 继承者 java.util.Calendar 所有已实现的接口: Serializable, Cloneable, Comparable<Calendar> 直接已知子类: GregorianCalendar 对于日期字段:

时间类和日期类派生出时间日期类

今天再写一个多重继承的应用实例,时间类和日期类派生出时间日期类 程序代码 #include <iostream> using namespace std; class Date//日期类 { public: //构造函数 Date(int y = 0, int m = 0, int d = 0); //设置日期 void SetDate(int y,int m,int d); //打印日期 void PrintDate() { cout<<year<<"年&q

日期类详解

我不清楚大家在上大学的时候是什么样的情况,在我上大学的时候,老师在开课上第一节课的时候都会告诉我们,这本书他会将多少知识点?讲到哪里?考试考到哪里?以至于好多课程我学到的都只是皮毛基础的东西.导致现在不得不花很多的功夫来补以前落下的知识点.其中这个日期类就是一个很重要的知识点,在工作中经常会用到它,这个东西也不难,但是对于我自己来说经常忘这鬼,所以我这次就把它从头梳理一遍并且记录下来,供备以后使用. 首先介绍Date类的构造方法: 1. Date() 创建一个获取当前日期和时间的Date对象.

javascript-封装Date日期类

迁移时间:2017年5月27日18:43:02 Author:Marydon (一)对日期进行格式化 //自定义Date日期类的format()格式化方法 <script type="text/javascript"> // 对Date的扩展,将 Date 转化为指定格式的String // 月(M).日(d).小时(H).分(m).秒(s).季度(q) 可以用 1-2 个占位符, // 年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字

【C++】日期类+日期万年历+日期计算器

对于日期类,我们主要实现一下日期类的基本函数,构造,拷贝构造,运算符的重载,析构.当然这里运算符的重载需要实现的还是挺多的,如:=.<.>.<=.>=.等 #include <iostream> using namespace std; class Date { public:     Date(int year = 1990, int month = 1, int day = 1)     {         _year = year;         _month 

用c++实现的简单的日期类

自己写的这个日期类实现了简单的一些日期可能会用到的功能, 比如加减某一个日期等等,详细的已在代码里面标注出来了. #include <iostream>using namespace std; class Date{public: Date(int year = 1900, int month = 1, int day = 1)  :_year(year)    //初始化列表     ,_month(month)     ,_day(day) {  if (year < 1900