From 65bd860249b3fc284558144eb81df413d92b32ca Mon Sep 17 00:00:00 2001 From: John Ralls Date: Sat, 1 Jan 2022 16:05:06 -0800 Subject: [PATCH] Fix relative_date_to_time64 calculations. Where the date requested extends beyond the start or end of the year. --- libgnucash/app-utils/gnc-option-date.cpp | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/libgnucash/app-utils/gnc-option-date.cpp b/libgnucash/app-utils/gnc-option-date.cpp index 30847b2a53..3d2a3e141f 100644 --- a/libgnucash/app-utils/gnc-option-date.cpp +++ b/libgnucash/app-utils/gnc-option-date.cpp @@ -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) {