Update iso_week to use closest Thursday algorithm

This commit is contained in:
Howard Hinnant
2026-04-16 16:27:08 -04:00
parent c7690c0e95
commit 7875f43aa9
+6 -6
View File
@@ -1514,13 +1514,13 @@ year_weeknum_weekday::from_days(days d) NOEXCEPT
{ {
const auto dp = sys_days{d}; const auto dp = sys_days{d};
const auto wd = iso_week::weekday{dp}; const auto wd = iso_week::weekday{dp};
auto y = date::year_month_day{dp + days{3}}.year(); auto closest_thursday = [wd, dp](sys_days tp)
auto start = sys_days((y - date::years{1})/date::dec/date::thu[date::last]) + (mon-thu);
if (dp < start)
{ {
--y; auto i = static_cast<int>(unsigned{wd});
start = sys_days((y - date::years{1})/date::dec/date::thu[date::last]) + (mon-thu); 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( const auto wn = iso_week::weeknum(
static_cast<unsigned>(date::trunc<weeks>(dp - start).count() + 1)); static_cast<unsigned>(date::trunc<weeks>(dp - start).count() + 1));
return {iso_week::year(static_cast<int>(y)), wn, wd}; return {iso_week::year(static_cast<int>(y)), wn, wd};