From 7875f43aa9288d176191c83e8284d61acdd5ab7c Mon Sep 17 00:00:00 2001 From: Howard Hinnant Date: Thu, 16 Apr 2026 16:27:08 -0400 Subject: [PATCH] Update iso_week to use closest Thursday algorithm --- include/date/iso_week.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/include/date/iso_week.h b/include/date/iso_week.h index de6ea39..88f7939 100644 --- a/include/date/iso_week.h +++ b/include/date/iso_week.h @@ -1514,13 +1514,13 @@ year_weeknum_weekday::from_days(days d) NOEXCEPT { const auto dp = sys_days{d}; const auto wd = iso_week::weekday{dp}; - auto y = date::year_month_day{dp + days{3}}.year(); - auto start = sys_days((y - date::years{1})/date::dec/date::thu[date::last]) + (mon-thu); - if (dp < start) + auto closest_thursday = [wd, dp](sys_days tp) { - --y; - start = sys_days((y - date::years{1})/date::dec/date::thu[date::last]) + (mon-thu); - } + auto i = static_cast(unsigned{wd}); + return dp + days{4-i}; + }; + auto y = date::year_month_day{closest_thursday(dp)}.year(); + auto start = sys_days(y/date::jan/date::thu[1]) - (thu-mon); const auto wn = iso_week::weeknum( static_cast(date::trunc(dp - start).count() + 1)); return {iso_week::year(static_cast(y)), wn, wd};