1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
#include "DateTime.h"
/* Private */
bool DateTime::isLeapYear() {
// Implements https://en.wikipedia.org/wiki/Leap_year#Gregorian_calendar
return year % 400 == 0 || year % 100 != 0 || year % 4 == 0;
}
unsigned short DateTime::daysInMonth() {
if (month == 2)
return 28 + isLeapYear();
if (month <= 7)
return 30 + month % 2;
return 31 - month % 2;
}
/* Public */
DateTime::DateTime(unsigned short hour, unsigned short minute, unsigned short day, unsigned short month, unsigned short year) {
this->hour = hour;
this->minute = minute;
this->day = day;
this->month = month;
this->year = year;
}
int DateTime::compare(const DateTime& other) const {
if (year < other.year || month < other.month || day < other.day || hour < other.hour || minute < other.minute)
return -1;
return year > other.year || month > other.month || day > other.day || hour > other.hour || minute > other.minute;
}
unsigned short DateTime::get_hour() const {
return hour;
}
bool DateTime::set_hour(unsigned short newHour) {
if (newHour > 23)
return false;
hour = newHour;
return true;
}
unsigned short DateTime::get_minute() const {
return minute;
}
bool DateTime::set_minute(unsigned short newMinute) {
if (newMinute > 59)
return false;
minute = newMinute;
return true;
}
unsigned short DateTime::get_day() const {
return day;
}
bool DateTime::set_day(unsigned short newDay) {
if (newDay == 0 || newDay > daysInMonth())
return false;
day = newDay;
return true;
}
unsigned short DateTime::get_month() const {
return month;
}
bool DateTime::set_month(unsigned short newMonth) {
if (newMonth == 0 || newMonth > 12)
return false;
month = newMonth;
return true;
}
unsigned short DateTime::get_year() const {
return year;
}
bool DateTime::set_year(unsigned short newYear) {
year = newYear;
return true;
}
/* Outside of class */
std::istream& operator>>(std::istream& istr, DateTime& dt) {
unsigned short h, m, d, M, y;
istr >> h >> m >> d >> M >> y;
dt = DateTime(h, m, d, M, y);
return istr;
}
std::ostream& operator<<(std::ostream& ostr, const DateTime& dt) {
bool padh = dt.get_hour() < 10, padm = dt.get_minute() < 10;
ostr << ((padh) ? "0" : "") << dt.get_hour() << ":" << ((padm) ? "0" : "") << dt.get_minute() << " " << dt.get_day() << "." << dt.get_month() << "." << dt.get_year();
return ostr;
}
|