Date

本文介绍了一个日期时间类的设计实现,包括日期和时间的基本操作、比较、格式化等,并提供了日期时间类的使用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

日期类的实现

注意日期合法的判断的函数和比较时间先后的函数

date.h

#include<iostream>
#include<string>
#include<sstream>
using namespace std;
class Date;
ostream& operator<<(ostream& out, const Date& date);
istream& operator>>(istream& in, Date& date);

class Date {
    private:
        int year;
        int month;
        int day;
    public:
        Date(int year = 0, int month = 0, int day = 0);
        Date(const Date& date);
        ~Date();
        void setYear(int year);
        void setMonth(int month);
        void setDay(int day);
        int getYear() const;
        int getMonth() const;
        int getDay() const;

        string toString() const;
        bool isValid();
        int daysOfMonth();
        void increment();
        Date after(int days);

        bool operator <(const Date& date);
        bool operator >(const Date& date);
        Date& operator =(const Date& date);
        bool operator ==(const Date& date);
        bool operator !=(const Date& date);

        int& operator[](int index);

        Date& operator ++();
        Date operator ++(int temp);

        friend ostream& operator<<(ostream& out, const Date & date);
        friend istream& operator>>(istream& in, Date & date);
};
Date::Date(int year, int month, int day) {
    this->year = year;
    this->month = month;
    this->day = day;
}

Date::Date(const Date& date) {
    *this = date;
}

Date::~Date() {}

void Date::setYear(int year) {
    this->year = year;
}

void Date::setMonth(int month) {
    this->month = month;
}

void Date::setDay(int day) {
    this->day = day;
}

int Date::getYear() const {
    return year;
}

int Date::getMonth() const {
    return month;
}

int Date::getDay() const {
    return day;
}

string intTranStr1(int integer) {
    stringstream ss;
    ss << integer;
    return ss.str();
}

void Date::increment() {
    ++(*this);
}

int Date::daysOfMonth() {
    if ((month%2 == 1 && month < 8) || (month%2 == 0 && month >= 8)) return 31;
    if (month  == 4 || month == 6 || month == 9 || month == 11) return 30;
    if ((year%4 == 0 && year%100 != 0) || year%400 == 0) return 29;
    return 28;
}

string Date::toString() const {
    return ("[" + intTranStr1(year) + "-" + intTranStr1(month) +\
        "-" + intTranStr1(day) + "]");
}

bool Date::isValid() {
    if (year <= 0) return false;
    if (month <= 0 || month > 12) return false;
    if (day <= 0 || day > 31) return false;
    return (day <= daysOfMonth());
}

Date Date::after(int days) {
    Date temp = Date(*this);
    while (days--) {
        ++temp;
    }
    return temp;
}

bool Date::operator <(const Date& date) {
    if (year < date.getYear()) return true;
    if (year > date.getYear()) return false;
    if (month < date.getMonth()) return true;
    if (month > date.getMonth()) return false;
    return (day < date.getDay());
}

bool Date::operator >(const Date& date) {
    return (*this != date) && !(*this < date);
}

Date& Date::operator =(const Date& date) {
    year = date.getYear();
    month = date.getMonth();
    day = date.getDay();
    return *this;
}

bool Date::operator ==(const Date& date) {
    return (year == date.getYear() &&\
        month == date.getMonth() && day == date.getDay());
}

bool Date::operator !=(const Date& date) {
    return !(*this == date);
}

int& Date::operator[](int index) {
    if (index == 0) return year;
    if (index == 1) return month;
    else return day;
}

Date& Date::operator ++() {
    day++;
    if (day > daysOfMonth()) {
        day = 1;
        month++;
        if (month > 12) {
            month = 1;
            year++;
        }
    }
    return *this;
}

Date Date::operator ++(int temp) {
    Date tmp = *this;
    ++(*this);
    return tmp;
}

ostream& operator<<(ostream& out, const Date& date) {
    out << date.toString() << endl;
    return out;
}

istream& operator>>(istream& in, Date& date) {
    in >> date.year >> date.month >> date.day;
    return in;
}

Time.h

class Time {
    private:
        int hour;
        int minute;
        int second;
    public:
        Time(int hour = 0, int minute = 0, int second = 0);
        Time(const Time& time);
        ~Time();
        void setHour(int hour);
        void setMinute(int minute);
        void setSecond(int second);
        int getHour() const;
        int getMinute() const;
        int getSecond() const;
        string toString() const;
        bool isValid() const;
        Time after(int seconds);
        void increment();
};

Time::Time(int hour, int minute, int second) {
    this->hour = hour;
    this->minute = minute;
    this->second = second;
}

Time::Time(const Time& time) {
    this->hour = time.getHour();
    this->minute = time.getMinute();
    this->second = time.getSecond();
}

Time::~Time() {}

void Time::setHour(int hour) {
    this->hour = hour;
}

void Time::setMinute(int minute) {
    this->minute = minute;
}

void Time::setSecond(int second) {
    this->second = second;
}

int Time::getHour() const {
    return hour;
}

int Time::getMinute() const {
    return minute;
}

int Time::getSecond() const {
    return second;
}

bool Time::isValid() const {
    if (hour < 0 || hour >= 24) return false;
    if (minute < 0 || minute >= 60) return false;
    if (second < 0 || second >= 60) return false;
    return true;
}

// auxiliary function that transfers the integer to string..
string intTranStr(int integer) {
    stringstream ss;
    ss << integer;
    return ss.str();
}

string Time::toString() const {
    string result = "";
    if (hour%12 < 10) result += "0";
    result += (intTranStr(hour%12) + ":");
    if (minute < 10) result += "0";
    result += (intTranStr(minute) + ":");
    if (second < 10) result += "0";
    result += intTranStr(second);
    if (hour >= 12) result += " PM";
    else result += " AM";
    return result;
}

Time Time::after(int seconds) {
    Time temp_time = Time(*this);
    while (seconds--) {
        temp_time.increment();
    }
    return temp_time;
}

void Time::increment() {
    second++;
    if (second >= 60) {
        second = 0;
        minute++;
        if (minute >= 60) {
            minute = 0;
            hour++;
            if (hour >= 24) hour = 0;
        }
    }
}

Datetime.h

class Datetime:public Date, public Time {
public:
  Datetime(int y, int m, int d, int hr, int min, int sec);
  Datetime(const Date& d, const Time& t);
  ~Datetime();
  string toString();
  Datetime after(int seconds);
  bool operator<(const Datetime& dt);
  bool operator>(const Datetime& dt);
  Datetime& operator=(const Datetime& dt);
  bool operator==(const Datetime& dt);
  bool operator!=(const Datetime& dt);
  Datetime& operator++();
  Datetime operator++(int temp);
};
Datetime::Datetime(int y, int m, int d, int hr, int min, int sec):\
Date(y, m, d), Time(hr, min, sec) {}
Datetime::Datetime(const Date& d, const Time& t):Date(d), Time(t) {}
string Datetime::toString() {
  Date::toString();
  Time::toString();
  string result;
  result = Date::toString();
  result += " ";
  result += Time::toString();
  return result;
}
Datetime::~Datetime() {
  cout << "Destructor:" << this->toString() << endl;
}
bool Datetime::operator<(const Datetime& dt) {
  if (getYear() < dt.getYear()) return true;
  else if (getYear() == dt.getYear()) {
    if (getMonth() < dt.getMonth()) return true;
    else if (getMonth() == dt.getMonth()) {
      if (getDay() < dt.getDay()) return true;
      else if (getDay() == dt.getDay()) {
        if (getHour() < dt.getHour()) return true;
        else if (getHour() == dt.getHour()) {
          if (getMinute() < dt.getMinute()) return true;
          else if (getMinute() == dt.getMinute()) {
            if (getSecond() < dt.getSecond()) return true;
            else return false;
          } else {
            return false;
          }
        } else {
          return false;
        }
      } else {
        return false;
      }
    } else {
      return false;
    }
  } else {
    return false;
  }
}
bool Datetime::operator>(const Datetime& dt) {
  if (getYear() > dt.getYear()) return true;
  else if (getYear() == dt.getYear()) {
    if (getMonth() > dt.getMonth()) return true;
    else if (getMonth() == dt.getMonth()) {
      if (getDay() > dt.getDay()) return true;
      else if (getDay() == dt.getDay()) {
        if (getHour() > dt.getHour()) return true;
        else if (getHour() == dt.getHour()) {
          if (getMinute() > dt.getMinute()) return true;
          else if (getMinute() == dt.getMinute()) {
            if (getSecond() > dt.getSecond()) return true;
            else return false;
          } else {
            return false;
          }
        } else {
          return false;
        }
      } else {
        return false;
      }
    } else {
      return false;
    }
  } else {
    return false;
  }
}
bool Datetime::operator==(const Datetime& dt) {
  if (getYear() == dt.getYear())
  if (getMonth() == dt.getMonth())
  if (getDay() == dt.getDay())
  if (getHour() == dt.getHour())
  if (getMinute() == dt.getMinute())
  if (getSecond() == dt.getSecond())
  return true;
  return false;
}
bool Datetime::operator!=(const Datetime& dt) {
  if (getYear() == dt.getYear())
  if (getMonth() == dt.getMonth())
  if (getDay() == dt.getDay())
  if (getHour() == dt.getHour())
  if (getMinute() == dt.getMinute())
  if (getSecond() == dt.getSecond())
  return false;
  return true;
}
Datetime& Datetime::operator=(const Datetime& dt) {
  setYear(dt.getYear());
  setMonth(dt.getMonth());
  setDay(dt.getDay());
  setHour(dt.getHour());
  setMinute(dt.getMinute());
  setSecond(dt.getSecond());
  return *this;
}
Datetime& Datetime::operator++() {
  setSecond(getSecond() + 1);
  if (getSecond() >= 60) {
    setMinute(getMinute() + getSecond()/60);
    setSecond(getSecond()%60);
    if (getMinute() >= 60) {
      setHour(getMinute()/60 + getHour());
      setMinute(getMinute()%60);
      if (getHour() >= 12) {
      setDay(getDay() + getHour()/24);
      setHour(getHour()%24);
      }
    }
  }
  if (!daysOfMonth()) {
    switch (getMonth()) {
      case 1:
      case 3:
      case 5:
      case 7:
      case 8:
      case 10:
      case 12:
      setMonth(getDay()/31);
      setDay(getDay()%31);
      if (getMonth() > 12) {
        setYear(getMonth()/12);
        setMonth(getMonth()%12);
      }
      case 4:
      case 6:
      case 9:
      case 11:
      setMonth(getDay()/30);
      setDay(getDay()%30);
      if (getMonth() > 12) {
        setYear(getMonth()/12);
        setMonth(getMonth()%12);
      }
      case 2:
      if ((getYear()%4 == 0&&getYear()%100 != 0)||getYear()%400 == 0) {
        setMonth(getDay()/29);
        setDay(getDay()%29);
        if (getMonth() > 12) {
          setYear(getMonth()/12);
          setMonth(getMonth()%12);
        }
      } else {
        setMonth(getDay()/28);
        setDay(getDay()%28);
        if (getMonth() > 12) {
          setYear(getMonth()/12);
          setMonth(getMonth()%12);
        }
      }
    }
  }
  return *this;
}
Datetime Datetime::operator++(int temp) {
  Datetime dt = *this;
  ++(*this);
  return dt;
}
Datetime Datetime::after(int seconds) {
  Datetime dt = Datetime(getYear(), getMonth(), getDay(), getHour(),\
  getMinute(), getSecond());
  dt.setSecond(dt.getSecond() + seconds);
  if (dt.getSecond() >= 60) {
    dt.setMinute(dt.getMinute() + dt.getSecond()/60);
    dt.setSecond(dt.getSecond()%60);
    if (dt.getMinute() >= 60) {
      dt.setHour(dt.getMinute()/60 + dt.getHour());
      dt.setMinute(dt.getMinute()%60);
      if (dt.getHour() >= 24) {
      dt.setDay(dt.getDay() + dt.getHour()/24);
      dt.setHour(dt.getHour()%24);
      }
    }
  }
    switch (dt.getMonth()) {
      case 1:
      case 3:
      case 5:
      case 7:
      case 8:
      case 10:
      case 12:
      if (dt.getDay() > 31) {
      dt.setMonth(dt.getMonth() + dt.getDay()/31);
      dt.setDay(dt.getDay()%31);
      if (dt.getMonth() > 12) {
        dt.setYear(dt.getYear() + dt.getMonth()/12);
        dt.setMonth(dt.getMonth()%12);
      }
      }
      case 4:
      case 6:
      case 9:
      case 11:
      if (dt.getDay() > 30) {
      dt.setMonth(dt.getMonth() + dt.getDay()/30);
      dt.setDay(dt.getDay()%30);
      if (dt.getMonth() > 12) {
        dt.setYear(dt.getYear() + dt.getMonth()/12);
        dt.setMonth(dt.getMonth()%12);
      }
      }
      case 2:
      if ((dt.getYear()%4 == 0&&dt.getYear()%100 != 0)||dt.getYear()%400 == 0) {
        if (dt.getDay() > 29) {
        dt.setMonth(dt.getMonth() + dt.getDay()/29);
        dt.setDay(dt.getDay()%29);
        if (dt.getMonth() > 12) {
          dt.setYear(dt.getYear() + dt.getMonth()/12);
          dt.setMonth(dt.getMonth()%12);
        }
        }
      } else {
        if (dt.getDay() > 28) {
        dt.setMonth(dt.getMonth() + dt.getDay()/28);
        dt.setDay(dt.getDay()%28);
        if (dt.getMonth() > 12) {
          dt.setYear(dt.getYear() + dt.getMonth()/12);
          dt.setMonth(dt.getMonth()%12);
        }
        }
      }
    }
  return dt;
}

main.cpp

int main() {
    Datetime datetime1(2015, 3, 21, 23, 59, 58);

    // test for overloaded operator ++.
    Datetime datetime2 = (datetime1++);
    cout << datetime2.toString() << endl;
    cout << datetime1.toString() << endl;
    datetime2 = ++datetime1;
    cout << datetime2.toString() << endl;
    cout << datetime1.toString() << endl;

    Datetime datetime3(datetime2);
    if (datetime3 == datetime1) cout << "They are the same!" << endl;
    else cout << "They are different!" << endl;

    int year, month, day, hour, minute, second;
    cin >> year >> month >> day >> hour >> minute >> second;
    datetime3.setYear(year);
    datetime3.setMonth(month);
    datetime3.setDay(day);
    datetime3.setHour(hour);
    datetime3.setMinute(minute);
    datetime3.setSecond(minute);

    if (datetime3 != datetime1) cout << "They are different!\n";
    else cout << "They are not different!\n";
    if (datetime3 > datetime1) cout << "First datetime"
        << "is latter than the second one.\n";
    if (datetime3 < datetime1) cout << "First datetime"
        << "is earlier than the second one.\n";

    int seconds = 10;
    cin >> seconds;
    cout << datetime3.after(seconds).toString() << endl;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值