From d2b06de8f2d60dad40856057deedbe0a553d5cbb Mon Sep 17 00:00:00 2001 From: ANSHUL SINGH <72524975+ekanshul@users.noreply.github.com> Date: Fri, 30 Oct 2026 17:43:51 +0000 Subject: [PATCH] Fix ISO week-date parsing for years before 1000 strptime %Y matches exactly four digits, so interpolating an unpadded year made 0416-W34-6 and similar week dates raise ParserError. Fixes #1076 --- src/pendulum/parsing/iso8601.py | 3 ++- tests/parsing/test_parse_iso8601.py | 7 +++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/pendulum/parsing/iso8601.py b/src/pendulum/parsing/iso8601.py index c65d249e5..f62e2a54e 100644 --- a/src/pendulum/parsing/iso8601.py +++ b/src/pendulum/parsing/iso8601.py @@ -447,7 +447,8 @@ def _get_iso_8601_week( year += 1 fmt = "%Y-%j" - string = f"{year}-{ordinal}" + # %Y matches exactly four digits; years below 1000 must be zero-padded. + string = f"{year:04d}-{ordinal}" dt = datetime.datetime.strptime(string, fmt) diff --git a/tests/parsing/test_parse_iso8601.py b/tests/parsing/test_parse_iso8601.py index ed2d39887..afe44940f 100644 --- a/tests/parsing/test_parse_iso8601.py +++ b/tests/parsing/test_parse_iso8601.py @@ -29,6 +29,13 @@ ("2008-W39-6", date(2008, 9, 27)), ("2009-W53-7", date(2010, 1, 3)), ("2009-W01-1", date(2008, 12, 29)), + # Week dates with years below 1000 (%Y needs four digits) + ("1000-W34-6", date(1000, 8, 23)), + ("0999-W34-6", date(999, 8, 24)), + ("0416-W34-6", date(416, 8, 27)), + ("0416W346", date(416, 8, 27)), + ("0416-W34", date(416, 8, 22)), + ("0004-W10-5", date(4, 3, 5)), # Time ("12:34", time(12, 34, 0)), ("12:34:56", time(12, 34, 56)),