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)),