44 constexpr int64_t BIAS_292277022000 = 9223371890843040000LL;
45 constexpr int64_t BIAS_2000 = 946684800LL;
48 int64_t secs = -((
static_cast<int64_t
>(
ts) - BIAS_2000) - BIAS_292277022000);
52 y -= n_400_years * 400LL;
56 y -= n_100_years * 100LL;
75 date_time.year = y - 1;
80 constexpr int JAN_AND_FEB_DAY_LEAP_YEAR = 60 - 1;
81 constexpr int TABLE_MONTH_OF_YEAR[] = {
82 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
83 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
84 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
85 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
86 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
87 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
88 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
89 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
90 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
91 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,
92 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,
93 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,
95 constexpr int TABLE_DAY_OF_YEAR[] = {
96 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,
97 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,
98 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,
99 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,
100 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,
101 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,
102 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,
103 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,
104 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,
105 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,
106 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,
107 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,
111 const int prev_days =
days - 1;
112 date_time.day =
days == JAN_AND_FEB_DAY_LEAP_YEAR ? (TABLE_DAY_OF_YEAR[prev_days] + 1) :
113 (
days > JAN_AND_FEB_DAY_LEAP_YEAR ? TABLE_DAY_OF_YEAR[prev_days] : TABLE_DAY_OF_YEAR[
days]);
114 date_time.mon =
days >= JAN_AND_FEB_DAY_LEAP_YEAR ? TABLE_MONTH_OF_YEAR[prev_days] : TABLE_MONTH_OF_YEAR[
days];
116 date_time.day = TABLE_DAY_OF_YEAR[
days];
117 date_time.mon = TABLE_MONTH_OF_YEAR[
days];
121 date_time.hour =
static_cast<decltype(date_time.hour)
>(day_secs /
SEC_PER_HOUR);
123 date_time.min =
static_cast<decltype(date_time.min)
>(min_secs /
SEC_PER_MIN);
124 date_time.sec =
static_cast<decltype(date_time.sec)
>(min_secs - date_time.min *
SEC_PER_MIN);
125# ifdef TIME_SHIELD_CPP17
126 if TIME_SHIELD_IF_CONSTEXPR (std::is_floating_point<T2>::value) {
127 date_time.ms =
static_cast<int>(std::round(std::fmod(
static_cast<double>(
ts),
static_cast<double>(
MS_PER_SEC))));
128 }
else date_time.ms = 0;
130 if (std::is_floating_point<T2>::value) {
131 date_time.ms =
static_cast<int>(std::round(std::fmod(
static_cast<double>(
ts),
static_cast<double>(
MS_PER_SEC))));
132 }
else date_time.ms = 0;