Fix relative_date_to_time64 calculations.

Where the date requested extends beyond the start or end of the year.
pull/1191/head
John Ralls 4 years ago
parent 6841e5b5c8
commit 65bd860249

@ -434,13 +434,23 @@ normalize_reldate_tm(struct tm& now)
{
auto factor{abs(now.tm_mon) / 12};
now.tm_mon /= factor > 0 ? factor : 1;
now.tm_year += now.tm_mon < 0 ? -factor : factor;
now.tm_year += now.tm_mon < 0 ? -factor: factor;
auto days = [](auto month, int year)
{
auto mon{month % 12 + (month < 0 ? 12 : 0)};
auto num_days{days_in_month[mon]};
//Leap year check.
if (mon == 1 && year % 4 == 0 && !(year % 100 == 0 && (year + 1900) % 400 != 0))
++num_days;
return num_days;
};
while (now.tm_mday < 1)
now.tm_mday += days_in_month[--now.tm_mon];
now.tm_mday += days(--now.tm_mon, now.tm_year);
while (now.tm_mday > days_in_month[now.tm_mon])
now.tm_mday -= days_in_month[now.tm_mon++];
while (now.tm_mday > days(now.tm_mon, now.tm_year))
now.tm_mday -= days(now.tm_mon++, now.tm_year);
while (now.tm_mon < 0)
{

Loading…
Cancel
Save