1.日期类应该具有什么功能

计算两个日期间的间隔时间

给定一个日期,计算出减少x天数后的日期

给定一个日期,减少x天数后的日期

2.日期类的具体实现

需要注意的是:

为了提高的安全性,我只将要实现对象功能的方法放在了date的public区域中 而操作符重载函数还有一些其他不会被直接调用的函数我放到了private区域。

为了锻炼自己的代码能力 我也将一些常用的date类操作符重载如'<' '>' '<=' ' >=' '='等一些操作符重载函数写了出来

date类代码具体如下

int const Year = 2022, Month = 4, Day = 9;
class Date{
public:
//设置默认构造函数Date(int year = Year, int month = Month, int day = Day):_year(Year)//初始化, _month(Month), _day(Day)//构造函数函数体内放的是赋值{if (IsLegal(year, month, day))//检验输入的日期是否合法{_year = year;_month = month;_day = day;}elsecout << "输入格式错误!" << endl<<"请重新输入该日期"<<endl;}void menu(){cout << " 欢迎使用日期计算器    " << endl;cout << " 1.计算两个日期间的间隔时间  " << endl;cout << " 2.添加x天数后的日期." << endl;cout << " 3.减少x天数后的日期." << endl;cout << " 0.退出程序                      " << endl;cout << "请输入命令序号!"           << endl;}void DateDV()//计算间隔时间{int datescale,year,month,day,flag=1;while (flag){cout << "请输入第一个日期" << endl;cin >> datescale;year = datescale / 10000;month = (datescale % 10000) / 100;day = datescale % 100;if (IsLegal(year, month, day)){flag = 0;}elsecout << "输入格式错误!" << endl << "请重新输入该日期" << endl;}Date date1(year, month, day);flag = 1;while (flag){cout << "请再输入第二个日期" << endl;cin >> datescale;year = datescale / 10000;month = (datescale % 10000) / 100;day = datescale % 100;if (IsLegal(year, month, day)){flag = 0;}elsecout << "输入格式错误!" << endl << "请重新输入该日期" << endl;}Date date2(year, month, day);int datedv = date1 - date2;        if (datedv < 0)datedv = 0 - datedv;cout << "两个日期相差"<<datedv<<"天" << endl;}void GetAddDate(){//计算增加X天后的日期int datescale, year, month, day, flag = 1;while (flag){cout << "请输入一个日期" << endl;cin >> datescale;year = datescale / 10000;month = (datescale % 10000) / 100;day = datescale % 100;if (IsLegal(year, month, day)){flag = 0;}elsecout << "输入格式错误!" << endl << "请重新输入该日期" << endl;}Date n(year, month, day);cout << "请输入要加的天数" << endl;int days;cin >> days;n += days;LetLegal(n);n.Print();}void GetSubDate(){//计算减少X天后的日期int datescale, year, month, day, flag = 1;while (flag){cout << "请输入一个日期" << endl;cin >> datescale;year = datescale / 10000;month = (datescale % 10000) / 100;day = datescale % 100;if (IsLegal(year, month, day)){flag = 0;}elsecout << "输入格式错误!" << endl << "请重新输入该日期" << endl;}Date n(year, month, day);cout << "请输入要减去的天数" << endl;int days;cin >> days;n -= days;LetLegal(n);n.Print();}private:int _year;int _month;int _day;bool IsLegal(int year, int month, int day){        int arrm[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)arrm[2] += 1;if (year >= 0 && 1 <= month&&month <= 12&& 1 <= day &&day<= arrm[month])return true;elsereturn false;}Date& operator=(const Date &n)//{_year = n._year;_month = n._month;_day = n._day;return *this;}Date operator++(){_day++;return *this;}Date operator++(int){Date temp(*this);_day++;return temp;}//a+=b,即a=a+b;Date& operator+=(int days){_day += days;return *this;}Date& operator-=(int days){_day -= days;return *this;}Date operator-(int days){Date temp(*this);temp._day--;return temp;}int operator-(const Date &n)//两个日期相减还剩多少天(具有正负){int arrm[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };int ydv, dv, day1 = 0, day2 = 0;if ((_year / 4 == 0 && _year / 100 != 0) || _year / 400 == 0)arrm[2]++;for (int i = 1; i < _mouth; i++){day1 += arrm[i];}day1 += _day;int arrm2[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };if ((n._year / 4 == 0 && n._year / 100 != 0) || n._year / 400 == 0)arrm2[2]++;for (int i = 1; i <n._mouth; i++){day2 += arrm2[i];}day2 += n._day;ydv = _year - n._year;if (ydv == 0){dv = day1 - day2;return dv;}else if (ydv>0){int count = 0;for (int year = _year - 1; year > n._year; year--){if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)count++;}dv = ydv * 365 + count + (day1 - day2);return dv;}else{int count = 0;for (int year = n._year - 1; year > _year; year--){if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)count++;}dv = -ydv * 365 + count + (day2 - day1);return 0 - dv;}}Date operator+(int days){Date temp(*this);temp._day++;return temp;}bool operator==(const Date &n){if (_year == n._year&&_month == n._month&&_day == n._day)return true;elsereturn false;}bool operator<(const Date &n){if (*this - n)return false;return true;}bool operator<=(const Date &n){if (*this - n || *this - n == 0)return false;return true;}bool operator>(const Date &n){if (*this - n)return true;return false;}bool operator>=(const Date &n){if (*this - n || *this - n == 0)return true;return false;}void Print(){cout << _year << "年" << _month << "月" << _day << "日" << endl;}
void    LetLegal(Date &n){//如果日期格式错误,那么错误的地方一定在_day上int arrm[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };if (n._day>0)//_day>0{while (n._day > arrm[n._month]){if ((n._year % 4 == 0 && n._year / 100 != 0) || n._year % 400 == 0)arrm[2] ++;n._day -= arrm[n._month];if (n._month == 12){n._month = 1;n._year++;if(arrm[2]==29)arrm[2]--;}n._month++;  }return;}while (n._day < 0){if ((n._year / 4 == 0 && n._year / 100 != 0) || n._year / 400 == 0)arrm[2] ++;n._day += arrm[n._month - 1];if (n._month == 1){n._month = 12;n._year--;if (arrm[2] == 29)arrm[2]--;}n._month--;}return;}
};

3.主函数调用date方法实现date功能

int main()
{Date d1;d1.menu();int key;cin >> key;while (key){switch (key){case 1:d1.DateDV();break;case 2:d1.GetAddDate();break;case 3:d1.GetSubDate();break;case 0:break;default:cout << "error!" << endl;break;}if (key != 0){cout << "请输入命令序号" << endl;}cin >> key;if (key != 0){system("cls");d1.menu();}
}   system("pause");return 0;
}

作者目前C++仍处于学习阶段,代码中可能会有一些地方的语法复杂累赘,欢迎大家在评论区给予指正!

c++Date(日期)类方法实现日期计算器相关推荐

  1. pandas使用max函数和min函数计算dataframe日期(时间)数据列中最大日期和最小日期对应的数据行(maximum and minimum date or time row)

    pandas使用max函数和min函数计算dataframe日期(时间)数据列中最大日期和最小日期对应的数据行(maximum and minimum date or time row in data ...

  2. pandas将dataframe日期数据列的日期转化为日期当月第一天(每月1号)的日期并生成新的数据列(Setting date to beginning of month in dataframe)

    pandas将dataframe日期数据列的日期转化为日期当月第一天(每月1号)的日期并生成新的数据列(Setting date to beginning of month in dataframe) ...

  3. Java中时间戳和Date类型以及字符串日期的相互转换

    因为工作或学习时总是忘记这几个时间类型之间的相互转化方式,因此此博客作为一个日常笔记记录一下这三者之间转化的方式,好方便今后学习和工作使用. Date类型转化为字符串日期 测试代码块 // 示例打印当 ...

  4. js验证开始日期不能大于结束日期_Excel之日期与时间函数YEAR/MONTH/DAY/DATE/DATEFIF...

    本部分主要包括YEAR函数.MONTH函数.DAY函数.DATE函数.TODAY函数.NOW函数.HOUR函数.MINUTE函数.SECOND函数.TIME函数.DATEDIF函数.DAYS函数.DA ...

  5. java 日期是否合法_java 中 Date 类型快判断日期是否合法.

    // 如果日期不合法,则抛异常try {String date_str = 5555-22-33;SimpleDateFormat format=new SimpleDateFormat(yyyy-M ...

  6. js Date 对象用于处理日期和时间。

    来源:http://www.cnblogs.com/jianshao810/archive/2010/09/09/1821861.html Date 对象用于处理日期和时间. 创建 Date 对象的语 ...

  7. 一起Polyfill系列:让Date识别ISO 8601日期时间格式

    一.什么是ISO 8601日期时间格式 ISO 8601是国际标准化组织制定的日期时间表示规范,全称是<数据存储和交换形式·信息交换·日期和时间的表示方法>. 示例: 1. 2014-12 ...

  8. js使用在vue中Date来计算日期,当前日期前多少天的日期 两个日期相减或相加等

    首先要给Date内置函数添加一个方法用于格式化时间 // 扩展date的时间格式化 Date.prototype.Format = function (fmt) {var o = {"M+& ...

  9. MySQL Date and Time Functions(日期和时间)

    1.应用 1.如果数据库中时间格式是(2013-01-12 23:23:56-时间精确到秒) select * from product where timestamp(add_time) = '20 ...

最新文章

  1. 活动目录(Active Directory)域故障解决实例
  2. R语言指数分布(exponential distribution)函数(dexp, pexp, qexp rexp)实战
  3. 织梦多个栏目arclist调用副栏目不显示的解决办法
  4. java 匿名内部类 百科_java匿名内部类具体概念是什么,在什么地方用到?
  5. 重磅:服务器基础知识全解终极版(145页PPT)
  6. 计算机 图论基础知识,计算机基础知识
  7. 简单工厂模式(静态工厂模式)
  8. 软件测试——测试计划
  9. Android的Bundle传递数据的使用
  10. getline基本用途
  11. Cadence OrCAD Capture交叉参考报表生成方法图文教程
  12. php做一个每天的考勤表,教你做一个酷毙的考勤表!|
  13. docker容器无root 权限,如何获得docker容器里面的root权限
  14. 百度地图LV1.5实践项目开发工具类bmap.util.jsV1.0
  15. kubesphere+kubernetes搭建生产环境高可用集群(一)
  16. 拍照相册和裁剪保存图片集合
  17. 华为 P10 手机开始推送鸿蒙 HarmonyOS 2 内测版
  18. 怎么求中位数和分位数 概率密度函数_计量经济学中的“条件”与“无条件”...
  19. python实现求矩阵行列式、求逆矩阵等各种矩阵操作(不使用numpy包)
  20. LINUX命令全称英语

热门文章

  1. linux的双系统修复工具下载,Mbrfix官方下载_Mbrfix.exe双系统MBR修复工具下载 - 系统之家...
  2. 基于用户画像的电影推荐系统论文
  3. 有些事情现在不做,就一辈子也不会做了
  4. 微信小程序之获取skey保持登陆状态
  5. ef 数据迁移mysql_EF6 Codefirst+MySql 数据库迁移
  6. 当电摇家族进入C++(二)
  7. Android开发 之 MultiDex (apk中生成多个dex、dex分包)
  8. 【GO】Iris框架项目初始化并解决GoLand的代码提示问题
  9. 如何在UE5中重建哥特式建筑场景?
  10. 大小写字母转换(C语言)