Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .github/workflows/continuous_integration.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@ jobs:
matrix:
python-version: ["pypy-3.11", "3.8", "3.9", "3.10", "3.11", "3.12", "3.13", "3.14"]
os: [ubuntu-latest, macos-latest, windows-latest]
exclude:
# PyPy Windows often lacks binary wheels (pyyaml/regex); source builds fail.
- os: windows-latest
python-version: pypy-3.11
include:
- os: ubuntu-latest
path: ~/.cache/pip
Expand Down
5 changes: 3 additions & 2 deletions arrow/parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -713,7 +713,8 @@ def _build_datetime(parts: _Parts) -> datetime:
# day not given, default to 1
_day = 1

date_string = f"{year}-{week}-{_day}"
# %G/%V need zero-padded year/week; int() alone drops leading zeros.
date_string = f"{year:04d}-{week:02d}-{_day}"

# tokens for ISO 8601 weekdates
dt = datetime.strptime(date_string, "%G-%V-%u")
Expand Down Expand Up @@ -750,7 +751,7 @@ def _build_datetime(parts: _Parts) -> datetime:
"Month component is not allowed with the DDD and DDDD tokens."
)

date_string = f"{_year}-{day_of_year}"
date_string = f"{_year:04d}-{int(day_of_year):03d}"
try:
dt = datetime.strptime(date_string, "%Y-%j")
except ValueError:
Expand Down
8 changes: 8 additions & 0 deletions tests/test_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -542,6 +542,10 @@ def test_parse_YYYY_DDDD(self):

assert self.parser.parse("1998-006", "YYYY-DDDD") == datetime(1998, 1, 6)

# Years before 1000 need zero-padded %Y for strptime
assert self.parser.parse("0001-001", "YYYY-DDDD") == datetime(1, 1, 1)
assert self.parser.parse("0999-365", "YYYY-DDDD") == datetime(999, 12, 31)

with pytest.raises(ParserError):
self.parser.parse("1998-456", "YYYY-DDDD")

Expand Down Expand Up @@ -736,6 +740,10 @@ def test_parse_W(self):
assert self.parser.parse("2011W054T141701", "WTHHmmss") == datetime(
2011, 2, 3, 14, 17, 1
)
# Years before 1000 need zero-padded %G for strptime
assert self.parser.parse("0001-W01-1", "W") == datetime(1, 1, 1)
assert self.parser.parse("0999-W01-1", "W") == datetime(998, 12, 31)
assert arrow.get("0001-W01-1") == arrow.Arrow(1, 1, 1, tzinfo=timezone.utc)

bad_formats = [
"201W22",
Expand Down
Loading