C++实现日期类(Date类)
#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 (!isInvalidDate(_year, _month, _day))
{
_year = 1900;
_month = 1;
_day = 1;
}
}
Date operator+(int count)
{
Date tmp(*this);
tmp._day += count;
ToCorrect(tmp);
return tmp;
}
Date operator-(int count)
{
Date tmp(*this);
tmp._day -= count;
ToCorrect(tmp);
return tmp;
}
Date& operator++() //前置++
{
(*this)++;
return *this;
}
Date operator++(int) //后置++
{
Date tmp(*this);
(*this)+=1;
return tmp;
}
Date& operator--()
{
(*this)--;
return *this;
}
Date operator--(int)
{
Date tmp(*this);
(*this)--;
return tmp;
}
int operator-(const Date &d)
{
int flag = 1;
Date max = *this;
Date min = d;
if (*this<d)
{
max = d;
min = *this;
flag = -1;
}
int count=0;
while (min != max)
{
++min;
count++;
}
return count*flag;
}
Date& operator+=(int day)
{
*this = *this + day;
return *this;
}
bool operator!=(const Date &d)
{
return !(*this == d);
}
bool operator<(const Date &d)
{
return !((*this>d)||(*this==d));
}
bool operator>=(const Date &d)
{
return !(*this<d);
}
bool operator>(const Date &d)
{
return (_year > d._year
|| (_year == d._year && _month > d._month)
|| (_year == d._year && _month == d._month && _day > d._day));
}
bool operator==(const Date &d)
{
return ((_year == d._year) && (_month == d._month) && (_day == d._day));
}
public:
bool IsLeapYear(int year)
{
if(year % 400 || (year % 4 && year % 100))
return true;
return false;
}
int YearsOfMonth(int year, int month)
{
int day;
int days[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
day = days[month];
if (month == 2)
day += IsLeapYear(year);
return day;
}
Date ToCorrect(Date &d)
{
if (d._day>YearsOfMonth(d._year, d._month))
{
while (d._day > YearsOfMonth(d._year, d._month))
{
d._day -= YearsOfMonth(d._year,d._month);
if (d._month == 12)
{
d._year++;
d._month = 1;
}
else
{
++d._month;
}
}
}
else
{
while (d._day <= 0)
{
if (d._month == 1)
{
d._year--;
d._month = 12;
}
else
{
--d._month;
}
d._day += YearsOfMonth(d._year, d._month);
}
}
return d;
}
bool isInvalidDate(int year, int month, int day)
{
if ((year < 1) || (month<0 || month>12) || (day<0 || day>YearsOfMonth(year,month)))
return false;
return true;
}
void Display()
{
cout << _year << "-" << _month << "-" << _day << endl;
}
friend istream& operator>>(istream& is, Date &d);
friend ostream& operator<<(ostream& os, const Date &d);
private:
int _year;
int _month;
int _day;
};
istream& operator>>(istream& is, Date& d)
{
cout << "请输入一个日期" << endl;
is >> d._year >> d._month >> d._day;
return is;
}
ostream& operator<<(ostream& os, const Date &d)
{
cout << d._year << "-" <<d. _month << "-" << d._day << endl;
return os;
}
int main()
{
/*Date d1(2016,8,18);
//d1.Display();
//d1 = d1++;
cout << d1 << endl;*/
//Date d1(2015, 12, 3);
//(d1++).Display(); //d1.operator++(&d1, 0);
//(++d1).Display(); //d1.operator++(&d1);
Date d1(2015, 12, 3);
Date d2(2015, 11, 1);
cout << (d1 - d2) << endl;
//Date d1(2015, 12, 3);
//Date ret = d1 + 40; //operator+
//ret.Display();
/*Date d1(2015, 12, 3);
Date ret = d1 + 40;
d1 = ret;
ret = d1 - 40;
ret.Display();*/
/*Date ret;
Date d2(2015, 1, 1);
ret = d2 - 1;
ret.Display();*/
return 0;
}
C++实现日期类(Date类)的更多相关文章
- 日期操作类--Date类
Date-API ava.util包提供了Date类来封装当前的日期和时间.Date类提供两个构造函数来实例化Date对象.第一个构造函数使用当前日期和时间来初始化对象. Date( ) 第二个构造函 ...
- Java关于时间日期的Date类和Calendar类概述
1. System.currentTimeMillis()方法 可以获取当前时间距离1970年01月01日00时00分00秒的秒数,如果程序运行在北京时区,则获取的数据是当前时间距离1970 ...
- java日期时间Date类
java.util包提供了Date类来封装当前的日期和时间. Date类提供两个构造函数来实例化Date对象. 第一个构造函数使用当前日期和时间来初始化对象. Date( ) 第二个构造函数接收一个参 ...
- java常用类————Date类
Date类在Java.util包中. 一.功能介绍:创建Date对象,获取时间,格式化输出的时间. 二.对象创建:1.使用Date类无参数的构造方法创建的对象可以获取本地时间.例如: Date now ...
- Java学习关于时间操作的应用类--Date类、Calendar类及其子类
Date类 Date类封装了当期时间和日期.与Java1.0定义的原始版的Date类相比,Date类发生了本质的变化.在Java1.1发布时,原始版Date类定义的许多功能被移进Calendar类和D ...
- Java api 入门教程 之 JAVA的Date类与Calendar类
在JDK1.0中,Date类是唯一的一个代表时间的类,但是由于Date类不便于实现国际化,所以从JDK1.1版本开始,推荐使用Calendar类进行时间和日期处理. 一.这里简单介绍一下Date类的使 ...
- JAVA的Date类与Calendar类【转】
Date类 在JDK1.0中,Date类是唯一的一个代表时间的类,但是由于Date类不便于实现国际化,所以从JDK1.1版本开始,推荐使用Calendar类进行时间和日期处理.这里简单介绍一下Date ...
- Java的Date类与Calendar类
一:Date类 在JDK1.0中,Date类是唯一的一个代表时间的类,但是由于Date类不便于实现国际化,所以从JDK1.1版本开始,推荐使用Calendar类进行时间和日期处理.这里简单介绍一下Da ...
- Date 类 02
Date类 在JDK1.0中,Date类是唯一的一个代表时间的类,但是由于Date类不便于实现国际化,所以从JDK1.1版本开始,推荐使用Calendar类进行时间和日期处理.这里简单介绍一下Date ...
- Java知多少(77)日期和时间类
Java 的日期和时间类位于 java.util 包中.利用日期时间类提供的方法,可以获取当前的日期和时间,创建日期和时间参数,计算和比较时间. Date 类 Date 类是 Java 中的日期时间类 ...
随机推荐
- asp.net @reqister指令
@register指令通过声明将自定义 ASP.NET 服务器控件添加到页或用户控件中. 1.@register 指令有两种用法如下 <%@ Register tagprefix="t ...
- vi编辑器的常见使用技巧
光标移动 在普通模式下, 1.按 h 向左移动光标 按 h + 数字n 可以向右移动 n个字符 比如 h + 5 就是向左移动5个字符 2.按j向下移动光标 3.按k向上移动光标 4.按 l 向 ...
- POJ 3678
Katu Puzzle Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7391 Accepted: 2717 Descr ...
- editplus的各式插件
C/C++, Java, JSP, C#, .NET, SQL, Pascal, Python, Assembly, Basic files http://www.editplus.com/javac ...
- ResourceBundle使用
一.认识国际化资源文件 这个类提供软件国际化的捷径.通过此类,可以使您所编写的程序可以: 轻松地本地化或翻译成不同的语言 一次处理多个语言环境 ...
- Java集合框架(四)
Collections 集合框架的工具类 着重讲解以下方法: 1.sort(): 1º根据元素的自然顺序对指定列表按升序进行排序,列表中的所有元素都必须实现comparable接口. pu ...
- 使用RockMongo管理MongoDB
http://blog.csdn.net/mydeman/article/details/7082730
- linux环境几个特殊的shell变量
特殊的shell变量: $0 获取当前执行的shell脚本的文件名 $n 获取当前执行的shell脚本的第n个参数值,n=1..9 $* 获取当前shell的所有参数 “$1 $2 $3 …注意 ...
- 15 things to talk about in a healthy relationship
15 things to talk about in a healthy relationship男女交往中可以谈论的15个话题 1. Your Daily Activities 1. 你的日常活动 ...
- VS2008 引用程序集 没有强名称 解决办法
为项目添加强名称方法:1.右键单击项目,打开属性窗口;2.在属性窗口里选择<签名>标签,选中为程序集签名的选项,在下拉列表里选择新建 3.打开新建签名窗口,输入签名的名称密码等内容 单击确 ...