Skip to content
Open
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: 2 additions & 2 deletions docs/docs/string_formatting.md
Original file line number Diff line number Diff line change
Expand Up @@ -106,9 +106,9 @@ The following tokens are currently supported:

| | Token | Output |
| ------------------------------ | ------------- | ------------------------------------------ |
| **Year** | YYYY | 2000, 2001, 2002 ... 2012, 2013 |
| **Year** | YYYY | 0001, 0002 ... 2000, 2001 ... 9999 |
| | YY | 00, 01, 02 ... 12, 13 |
| | Y | 2000, 2001, 2002 ... 2012, 2013 |
| | Y | 1, 2 ... 2000, 2001 ... 9999 |
| **Quarter** | Q | 1 2 3 4 |
| | Qo | 1st 2nd 3rd 4th |
| **Month** | MMMM | January, February, March ... |
Expand Down
4 changes: 2 additions & 2 deletions src/pendulum/formatting/formatter.py
Original file line number Diff line number Diff line change
Expand Up @@ -99,8 +99,8 @@ class Formatter:

_TOKENS_RULES: ClassVar[dict[str, Callable[[pendulum.DateTime], str]]] = {
# Year
"YYYY": lambda dt: f"{dt.year:d}",
"YY": lambda dt: f"{dt.year:d}"[2:],
"YYYY": lambda dt: f"{dt.year:04d}",
"YY": lambda dt: f"{dt.year % 100:02d}",
"Y": lambda dt: f"{dt.year:d}",
# Quarter
"Q": lambda dt: f"{dt.quarter:d}",
Expand Down
36 changes: 36 additions & 0 deletions tests/formatting/test_year_padding_regression.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
from __future__ import annotations

import pytest

import pendulum

from pendulum.formatting import Formatter


@pytest.mark.parametrize(
"year, full, short",
[
(1, "0001", "01"),
(9, "0009", "09"),
(10, "0010", "10"),
(99, "0099", "99"),
(100, "0100", "00"),
(101, "0101", "01"),
(999, "0999", "99"),
(1000, "1000", "00"),
(2009, "2009", "09"),
(9999, "9999", "99"),
],
)
def test_year_tokens_have_fixed_width(year: int, full: str, short: str) -> None:
value = pendulum.datetime(year, 3, 14)
assert Formatter().format(value, "YYYY YY Y") == f"{full} {short} {year}"
assert value.format("YYYY-MM-DD") == f"{full}-03-14"
assert value.format("YY-MM-DD") == f"{short}-03-14"
assert pendulum.from_format(value.format("YYYY-MM-DD"), "YYYY-MM-DD") == value


def test_year_padding_applies_to_localized_long_formats() -> None:
value = pendulum.datetime(42, 3, 14)
assert value.format("L", locale="en") == "03/14/0042"
assert value.format("[YYYY] YYYY [YY] YY [Y] Y") == "YYYY 0042 YY 42 Y 42"
Loading