C++实现简单的日期类、时间类

C++实现简单的日期类、时间类
重载++ – + -等运算符可以进行日期加天数、减天数、日期相减、
时间加分钟、减分钟、时间相减,整体实现比较简单,注意程序算法的简洁性。由于时间原因没有写日历表的操作,日历表也并不难,只要注意当前日期是周几,或者使用那个公式来进行计算当前日期是,输出的时候注意格式就好了。
加减天数算法的本质大概是从日单位开始向月、年单位进行进位或借位,通过一个while循环,直到日单位的天数符合月单位的天数时(合法时)退出循环,而在循环的过程中不断改变月、年以及新年对应的月份天数数组。加减分钟也类似

代码:

#include<iostream>
#include<ctime>
#include<algorithm>
using namespace std;
/* 
   日期类:
    重载+: 实现日期+days
 重载-: 实现日期-days 日期-日期
 重载++: 实现日期前置++
 重载--: 实现日期前置--
*/
class date {
protected:
 int _year;
 int _month;
 int _day;//保护乘员
public:
 void SetYear(int year) { _year = year; }
 void SetMonth(int month) { _month = month; }
 void SetDay(int day) { _day = day; }
 date(int year = 1700, int month = 1, int day = 1) {
  _year = year;
  _month = month;
  _day = day;
 }//重载默认值构造函数
 date(date &d) {
  _year = d._year;
  _month = d._month;
  _day = d._day;
 }//拷贝构造函数
 int leap_year(int now_year) { //判断闰年 是闰年返回1 否则返回0
  if ((now_year % 4 == 0 && now_year % 100 != 0) || (now_year % 400 == 0)) {
   return 1;
  }
  return 0;
 }
 friend ostream& operator<<(ostream &out,  date &d) {
  out << d._year << "-" << d._month << "-" << d._day;
  out << endl;
  return out;
 }//用于输出日期
 friend istream& operator>>(istream &in, date &d) {
  int year, month, day;
  cout << "请输入正确的年-月-日" << endl;
  cin >> year >> month >> day;
  d.SetYear(year);d.SetMonth(month);
  d.SetDay(day);
  return in;
 }//用于输入日期
 date& operator=(date &d) {
  _year = d._year;
  _month = d._month;
  _day = d._year;
 }//赋值构造函数
 date& operator+(int n) { //加上n天 n可能负数 可能加到下一年 可能加几年
  int months[12]={ 31,28,31,30,31,30,31,31,30,31,30,31 };
  if (leap_year(this->_year)){ //如果是闰年 1990 3 1 + 1000
   months[1] = 29;
  }
  int n_cor = abs(n);
  this->_day += n_cor;
  //一个循环搞定
  while (this->_day>months[this->_month-1]){
   this->_day -= months[this->_month - 1];
   this->_month += 1;
   if (this->_month > 12) { //超过一年了
    this->_month = 1;
    this->_year +=1 ;
    if (leap_year(this->_year)) {
     months[1] = 29;
    }
    else{
     months[1] = 28;
    }
   }
  }
  return *this;
 }//重载+运算符
 date& operator-(int n) { //减去n天 n可能为负数 n可能减到前一年 n可能减几年
  int months[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
  if (leap_year(this->_year)) {
   months[1] = 29;
  }
  int n_cor = abs(n);
  this->_day = this->_day - n_cor;
  //一个循环搞定
  while (this->_day <= 0) {
   this->_month -= 1;
   if (this->_month <= 0) {
    this->_year -= 1;
    if (leap_year(this->_year)) {
     months[1] = 29;
    }
    else {
     months[1] = 28;
    }
    this->_month = 12;
   }
  this->_day = this->_day + months[this->_month - 1];
 }
  return *this;
 }//重载减运算符
 date& operator++(){
  int months[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
  if (leap_year(this->_year)) {
   months[1] = 29;
  }
  this->_day++;
  if (this->_day>months[this->_month-1]){
   this->_day = this->_day - months[this->_month - 1];
   this->_month += 1;
   if (this->_month>12){
    this->_month = 1;
    this->_year++;
   }
  }
  return *this;
 }//重载前置++运算符;
 date& operator--() {
  int months[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
  if (leap_year(this->_year)) {
   months[1] = 29;
  }
  this->_day -= 1;
  if (this->_day <= 0) {
   this->_day = this->_day + months[this->_month - 1];
   this->_month -= 1;
   if (this->_month<=0){
    this->_month = 12;
    this->_year -= 1;
   }
  }
  return *this;
 }//重载前置--运算符
 int operator-(date &d) {
  int months[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
  if (leap_year(min(this->_year, d._year))) {
   months[1] = 29;
  }
  int d_days = d._day;
  int this_days = this->_day;
  if (this->_year != d._year) { //二者不在同一年
   int min_year = min(this->_year, d._year);//获得二者小的年份
   int now_year;
   for (now_year = min_year; now_year < this->_year; now_year++) {
    this_days += 365 + leap_year(now_year);
   }
   for (int m = 1; m < this->_month; m++) {
    this_days += months[m];
   }//计算this_days的值
   for (now_year = min_year; now_year < d._year; now_year++) {
    d_days += 365 + leap_year(now_year);
   }
   for (int m = 1; m < d._month; m++) {
    d_days += months[m];
   }
  }
  else{ //在同一年
   for (int m = 1; m < this->_month; m++) {
    this_days += months[m];
   }
   for (int m = 1; m < d._month; m++){
    d_days += months[m];
   }
  }
  return abs(d_days - this_days);
 }//重载-运算符 计算两日期相差的天数
 ~date(){ }//析构函数
};
/* 
    时间类:
    继承date 增加时分秒 
 可实现和日期相同的功能,支持分钟加减。
*/
class Time :public date{
private:
 int _hour;
 int _minute;
 int _second;
public:
 Time(int year, int month, int day,int hour=1,int min=1,int second=1):
  date(year,month,day),_hour(hour),_minute(min),_second(second){}
 void outtime() {
  cout << "该时间为:" << endl;
  cout<< _year<<"-"<<_month <<"-"<< _day <<"-"<< _hour <<"-" <<_minute <<"-"
   << _second;
  cout << endl;
 }//输出函数
 Time& Addmin(int minutes) { //加minutes分钟
  int summin=this->_minute, nowhours = this->_hour, adddays = 0;//初始化
  summin = this->_minute + minutes;//分单位总共有多少分钟
  nowhours = this->_hour+summin / 60;//小时单位总共有多少小时
  adddays = nowhours / 24;//小时单位将会产生几天的进位
  (*this) + adddays;//直接+adddays;
  this->_minute = summin % 60;
  this->_hour = nowhours % 24;
  //返回时间
  return *this;
 }//时间加分钟
 Time& Submin(int minutes) {
  this->_minute = this->_minute - minutes;
  while (this->_minute < 0) {
   this->_hour = this->_hour - 1;
   this->_minute += 60;
   if (this->_hour<=0){
    this->_hour = 24;
    (*this) - 1;
   }
  }
  return *this;
 }//时间减分钟
 long long  interval(Time &t) {
  int months[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
  if (leap_year(min(this->_year, t._year))) {
   months[1] = 29;
  }
  int min_year = min(t._year, this->_year);
  int this_days=this->_day, t_days=t._day;
  for (int now_year = min_year; now_year < this->_year; now_year++) {
   this_days += 365 + leap_year(now_year);
  }
  for (int m = 1; m < this->_month; m++) {
   this_days += months[m-1];
  }//计算this_days的值
  for (int now_year = min_year; now_year < t._year; now_year++) {
   t_days += 365 + leap_year(now_year);
  }
  for (int m = 1; m < t._month; m++) {
   t_days += months[m-1];
  }
  long long this_seconds = this_days * 24 * 3600+this->_hour*3600+this->_minute*60+this->_second;
  long long  t_seconds = t_days * 24 * 3600 +t._hour*3600 + t._minute * 60 + t._second;
  long long interva = abs(this_seconds - t_seconds);
  return interva;
 }//计算时间间隔 返回秒
 ~Time(){ }//析构函数
};
int main(){
 /*
 date d1(1999, 1, 4);cout << d1;
 d1 + 10000;
 cout << "该日期加10000天之后的日期为" << d1;
 cout << "-----------------------------------" << endl; //测试大数加
 date d2(2020, 6, 4);cout << d2;
 d2 - 1242;
 cout << "该日期减1242天之后的日期为" << d2;
 cout << "-----------------------------------" << endl; //测试大数减
 cout << "以上两日期日期相差天数为" << endl;
 cout << d1 - d2 << endl;
 cout << "-----------------------------------" << endl;//测试相差天数
 cout << "日期为:" << endl;
 date d3(2020, 2, 29);cout << d3;
 ++d3;
 cout << "该日期加一天之后的日期为" << endl;
 cout << d3;
 cout << "-----------------------------------" << endl;//测试加一天
 cout << "日期为:" << endl;
 date d4(2020, 1, 1); cout << d4;
 --d4;
 cout << "该日期减一天之后的日期为" << endl;
 cout << d4;
 cout << "-----------------------------------" << endl;//测试减一天
 cout << "日期为:" << endl;
 date d5(2019, 2, 28); cout << d5;
 ++d5;
 cout << "该日期加一天之后的日期为" << endl;
 cout << d5;
 cout << "-----------------------------------" << endl;//测试加一天
 Time t1(2020, 6, 4, 20, 22, 15);t1.outtime();
 t1.Addmin(1470);
 cout << "t1时间加1470分钟后";//测试加分钟
 t1.outtime();
 cout << "-----------------------------------" << endl;
 Time t2(2020, 6, 4, 20, 22, 15);t2.outtime();
 t2.Submin(1788480);
 cout << "t2时间减1788480分钟后" ;//测试减分钟
 t2.outtime();
 cout << "-----------------------------------" << endl;
 cout << "t2时间和t1时间的时间间隔为" << endl;
 long long interval = t2.interval(t1);
 int hour = interval / 3600;
 int min = (interval-(hour*3600))/60;
 int sec = (interval - hour * 3600 - min * 60);
 cout << hour << "小时 " << min <<  "分钟 " << sec << "秒" << " " << endl;//测试时间间隔
 */
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值