-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDate.cpp
More file actions
42 lines (34 loc) · 1.01 KB
/
Date.cpp
File metadata and controls
42 lines (34 loc) · 1.01 KB
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
struct _Date {
vector<int> mth, mth_sum;
_Date() {
mth = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
mth_sum = mth;
partial_sum(mth.begin(), mth.end(), mth_sum.begin());
}
};
struct Date: _Date {
int d, m, y;
int mdays() { return mth[m] + (m == 2) * leap(); }
int ydays() { return 365 + leap(); }
int msum() { return mth_sum[m-1] + (m > 2) * leap(); }
int ysum() { return 365*(y-1) + (y-1)/4 - (y-1)/100 + (y-1)/400; }
int count() { return (d-1) + msum() + ysum(); }
public:
Date() : d(1), m(1), y(1) {}
Date(int d, int m, int y) : d(d), m(m), y(y) {}
Date(int days) : d(1), m(1), y(1) { advance(days); }
// se o ano eh bissexto
bool leap() { return (y%4 == 0 and y%100) or (y%400 == 0); }
int weekDay() {
int x = y - (m<3);
return (x + x/4 - x/100 + x/400 + mth_sum[m-1] + d + 6)%7;
}
void advance(int days) {
days += count();
d = m = 1, y = 1 + days/366;
days -= count();
while(days >= ydays()) days -= ydays(), y++;
while(days >= mdays()) days -= mdays(), m++;
d += days;
}
};