やあ子供たち。
time_tのオレオレラッパーを作ってみたので紹介するぞ。最後に簡単なカレンダーの作り方もあるよ。
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <iomanip> #include <ctime> #include <string> using namespace std; #define TIMETNEO_LINEMAX 80 #define TIMETNEO_FORMAT_DATE "%d/%02d/%02d" #define TIMETNEO_FORMAT_TIME "%02d:%02d:%02d" class TimeNeo { public: TimeNeo(void) { this->LoadNow(); } TimeNeo(const TimeNeo& t) { _time = t._time; } void LoadNow(void) { _time = time(nullptr); } string getDateAsText(void) { int y, m, d; this->getDate(&y, &m, &d); char ss[TIMETNEO_LINEMAX]; sprintf(ss, TIMETNEO_FORMAT_DATE, y, m, d); return string(ss); } string getDateTimeAsText(void) { int y, m, d, h, min, s; this->getDateTime(&y, &m, &d, &h, &min, &s); char ss[TIMETNEO_LINEMAX]; sprintf(ss, TIMETNEO_FORMAT_DATE " " TIMETNEO_FORMAT_TIME, y, m, d, h, min, s); return string(ss); } void getDate(int* pyear, int* pmonth, int* pdate) { int h, m, s;// dummies getDateTime(pyear, pmonth, pdate, &h, &m, &s); return; } void getDateTime(int* pyear, int* pmonth, int* pdate, int* phour, int* pmin, int* psec) { tm tm0; localtime_s(&tm0, &_time); *pyear = tm0.tm_year + 1900;// 年次は1900年からの数え年! *pmonth = tm0.tm_mon + 1; // 月は0から11! *pdate = tm0.tm_mday; *phour = tm0.tm_hour; *pmin = tm0.tm_min; *psec = tm0.tm_sec; } int getYear() { tm tm0; localtime_s(&tm0, &_time); return tm0.tm_year + 1900;// 年次は1900年からの数え年! } int getMonth() { tm tm0; localtime_s(&tm0, &_time); return tm0.tm_mon + 1;// 月は0から11! } int getDay() { tm tm0; localtime_s(&tm0, &_time); return tm0.tm_mday; } int getWeekDay() { tm tm0; localtime_s(&tm0, &_time); return tm0.tm_wday; } void setDate(const int year, const int month, const int date) { // 人間が読める形式に変換 tm tm0; localtime_s(&tm0, &_time); // 必要な内容のみ更新 tm0.tm_year = year - 1900;// 年次は1900年からの数え年! tm0.tm_mon = month - 1;// 月は0から11! tm0.tm_mday = date; _time = mktime(&tm0); return; } void setDate(const int date) { // 人間が読める形式に変換 tm tm0; localtime_s(&tm0, &_time); // 必要な内容のみ更新 tm0.tm_mday = date; _time = mktime(&tm0); return; } void setDateTime(const int year, const int month, const int date, const int hour, const int min, const int sec) { // 人間が読める形式に変換 tm tm0; localtime_s(&tm0, &_time); // 必要な内容のみ更新 tm0.tm_year = year - 1900;// 年次は1900年からの数え年! tm0.tm_mon = month - 1;// 月は0から11! tm0.tm_mday = date; tm0.tm_hour = hour; tm0.tm_min = min; tm0.tm_sec = sec; _time = mktime(&tm0); return; } friend double operator-(const TimeNeo& a, const TimeNeo& b) { return difftime(a._time, b._time); } time_t operator=(const TimeNeo& a) { _time = a._time; return _time; } bool operator<(const TimeNeo& a) { return (a - *this) >= 0; } TimeNeo& advanceDate(const int dday) { int y, m, d, h, min, s; this->getDateTime(&y, &m, &d, &h, &min, &s); d += dday; this->setDateTime(y, m, d, h, min, s); return *this; } TimeNeo& advanceMonth(const int dmon) { int y, m, d, h, min, s; this->getDateTime(&y, &m, &d, &h, &min, &s); m += dmon; this->setDateTime(y, m, d, h, min, s); return *this; } TimeNeo& incDate(void) { return advanceDate(1); } TimeNeo& decDate(void) { return advanceDate(-1); } TimeNeo& incMonth(void) { return advanceMonth(1); } TimeNeo& decMonth(void) { return advanceMonth(-1); } time_t _time; }; int main(int argc, char* argv[]) { TimeNeo tn0; TimeNeo tn1; tn1.setDate(1971, 2, 17); cout << tn0.getDateTimeAsText() << endl; cout << tn1.getDateTimeAsText() << endl; { int y, m, d, h, min, s; tn0.getDateTime(&y, &m, &d, &h, &min, &s); d += 30; h += 12; tn0.setDateTime(y, m, d, h, min, s); cout << tn0.getDateTimeAsText() << endl; } TimeNeo tn2 = tn0; { int y, m, d, h, min, s; tn2.getDateTime(&y, &m, &d, &h, &min, &s); s += 30; tn2.setDateTime(y, m, d, h, min, s); cout << tn2.getDateTimeAsText() << endl; cout << "difftime: " << tn2 - tn1 << endl; } TimeNeo tn3; { int y, m, d, h, min, s; tn3.getDateTime(&y, &m, &d, &h, &min, &s); s-=1.6e9; tn3.setDateTime(y, m, d, h, min, s); cout << tn3.getDateTimeAsText() << endl; } cout<< ( tn3 < tn0) <<endl; ///////////////////////////////// // TimeNeoをつかってカレンダーを作ろう。 // TimeNeo idate; idate.setDate(2022, 8, 17);// ターゲット月の設定 cout << "**** Calendar " << setw(4) << to_string(idate.getYear()) <<"/"<< setw(2) << setfill('0') << to_string(idate.getMonth()) <<" ****" << endl; cout << "Sun Mon Tue Wed Thr Fri Sat" << endl; { // ターゲット月の左上の日付を得よう。 idate.setDate(1); while (idate.getWeekDay() != 0) idate.decDate(); // ターゲット月の右下の日付の次の日を得よう。 TimeNeo edate = idate; { edate.incMonth(); while (edate.getWeekDay() != 0) edate.incDate(); edate.decDate(); //cout << edate.getDateAsText() << endl;; } // ターゲット月を打ち出そう //cout << idate.getDateAsText() << endl; int col = 0; while (idate < edate) { cout << setw(2) << to_string(idate.getDay()) << " "; if (++col == 7) { cout << endl; col = 0; } idate.incDate(); }//while } return 0; }