6const int64_t kMaxComponentizedDuration =
7 (1024LL * 1024 * 64) * 24 * 3600 * 1000000LL - 1;
15 if (v > kMaxComponentizedDuration) v = kMaxComponentizedDuration;
34 if (micros == kMaxComponentizedDuration) {
35 return Micros(kMaxComponentizedDuration);
56int32_t days_from_civil(int32_t y, uint8_t m, uint8_t d)
noexcept {
58 const int32_t era = (y >= 0 ? y : y - 399) / 400;
59 const uint32_t yoe =
static_cast<uint16_t
>(y - era * 400);
61 (153 * (m + (m > 2 ? -3 : 9)) + 2) / 5 + d - 1;
62 const uint32_t doe = yoe * 365 + yoe / 4 - yoe / 100 + doy;
63 return era * 146097 +
static_cast<int32_t
>(doe) - 719468;
70void civil_from_days(int32_t z, int16_t* year, uint8_t* month,
71 uint8_t* day)
noexcept {
73 const int32_t era = (z >= 0 ? z : z - 146096) / 146097;
74 const uint32_t doe =
static_cast<uint32_t
>(z - era * 146097);
76 (doe - doe / 1460 + doe / 36524 - doe / 146096) / 365;
77 const int32_t y =
static_cast<int32_t
>(yoe) + era * 400;
78 const uint16_t doy = doe - (365 * yoe + yoe / 4 - yoe / 100);
79 const uint8_t mp = (5 * doy + 2) / 153;
80 const uint8_t d = doy - (153 * mp + 2) / 5 + 1;
81 const uint8_t m = mp + (mp < 10 ? 3 : -9);
90constexpr DayOfWeek weekday_from_days(int32_t z)
noexcept {
91 return static_cast<DayOfWeek>(z >= -4 ? (z + 4) % 7 : (z + 5) % 7 + 6);
95constexpr bool is_leap(int32_t y)
noexcept {
96 return y % 4 == 0 && (y % 100 != 0 || y % 400 == 0);
102uint16_t day_of_year(int16_t y, uint8_t m, uint8_t d) {
103 constexpr uint16_t days_to_month[12] = {0, 31, 59, 90, 120, 151,
104 181, 212, 243, 273, 304, 334};
105 uint16_t result = days_to_month[m - 1] + d;
106 if (m > 2 && is_leap(y)) result++;
113template <
typename Int>
114constexpr Int floor_mod(Int k, Int n) {
115 return ((k %= n) < 0) ? k + n : k;
121 :
DateTime(year, month, day, 0, 0, 0, 0, tz) {}
124 uint8_t minute, uint8_t second, uint32_t micros,
TimeZone tz)
134 day_of_week_ = weekday_from_days(t);
141 : walltime_(wall_time), tz_(tz) {
143 int32_t unix_days = sinceEpochTz.
inHours() / 24;
144 civil_from_days(unix_days, &year_, &month_, &day_);
145 day_of_year_ = day_of_year(year_, month_, day_);
146 day_of_week_ = weekday_from_days(unix_days);
147 uint64_t since_midnight = floor_mod<int64_t>(sinceEpochTz.
inMicros(),
148 (uint64_t)1000000 * 3600 * 24);
149 micros_ = since_midnight % 1000000L;
150 since_midnight /= 1000000L;
151 second_ = since_midnight % 60;
152 since_midnight /= 60;
153 minute_ = since_midnight % 60;
154 since_midnight /= 60;
155 hour_ = since_midnight;