long long __year_to_secs(long long year, int* is_leap) { | |
if (year - 2ULL <= 136) { | |
int y = year; | |
int leaps = (y - 68) >> 2; | |
if (!((y - 68) & 3)) { | |
leaps--; | |
if (is_leap) | |
*is_leap = 1; | |
} else if (is_leap) | |
*is_leap = 0; | |
return 31536000 * (y - 70) + 86400 * leaps; | |
} | |
int cycles, centuries, leaps, rem; | |
if (!is_leap) | |
is_leap = &(int){0}; | |
cycles = (year - 100) / 400; | |
rem = (year - 100) % 400; | |
if (rem < 0) { | |
cycles--; | |
rem += 400; | |
} | |
if (!rem) { | |
*is_leap = 1; | |
centuries = 0; | |
leaps = 0; | |
} else { | |
if (rem >= 200) { | |
if (rem >= 300) | |
centuries = 3, rem -= 300; | |
else | |
centuries = 2, rem -= 200; | |
} else { | |
if (rem >= 100) | |
centuries = 1, rem -= 100; | |
else | |
centuries = 0; | |
} | |
if (!rem) { | |
*is_leap = 0; | |
leaps = 0; | |
} else { | |
leaps = rem / 4U; | |
rem %= 4U; | |
*is_leap = !rem; | |
} | |
} | |
leaps += 97 * cycles + 24 * centuries - *is_leap; | |
return (year - 100) * 31536000LL + leaps * 86400LL + 946684800 + 86400; | |
} |