Repository navigation
datetime.strftime("%Y") is not padding correctly #120713
Description
Activity
- addedtype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error
on Jun 18, 2024 Reproducible on 3.10 but not on 3.11+.
cc @pganssle
I suppose that it works in such way since Python 3.0 (I tested in 3.3). 2.7 does not support years before 1900.
You can use %4Y to always get 4-digit year. I wonder whether this is a documentation issue or the output is platform depending.
Reacted by martinvuykI wonder whether this is a documentation issue or the output is platform depending.
Ah, so the issue is platform-dependent. When I reproduced the OP's issue in 3.10 I was doing it in Linux, while in Windows I tested the code in 3.11 and 3.13 and the issue was not reproduced. Now I realized that this is just a result of
datetime.strftimebeing a thin wrapper over the platform'sstrftimein the C library:According to the doc:
The full set of format codes supported varies across platforms, because Python calls the platform C library’s
strftime()function, and platform variations are common. To see the full set of format codes supported on your platform, consult thestrftime(3)documentation.Reacted by martinvuykThe limitation for year >= 1000 was removed in bpo-11930 (gh-56139). But there were various problems with the newly added test
test_strftime_y2k, it required several corrections.For now, we cannot guarantee the result for %Y (and %G) with year < 1000. It is especially bad since
strptime()requires the year to be 4 digits.Since
datetime.strftimealready uses a wrapper function to handle format specifiers not conforming to the Cstrftime, I think a reasonable fix would be to add the translation of%Yto%4Ythere as needed by the platform to make the function portable.Yes, but the problem is that %4Y is a glibc extension. There are platforms that return non-4-digit number and do not support %4Y. If we are going to guarantee 4 digits, the workaround may be much more complex.
Yes, but the problem is that %4Y is a glibc extension. There are platforms that return non-4-digit number and do not support %4Y. If we are going to guarantee 4 digits, the workaround may be much more complex.
With PR #120820 I've made sure that the translation is only used when explicitly supported by the platform so that it is at least an improvement and not a regression in any case. I did just revert my changes to the unit test to allow an outlier platform to pass the test.
Yes, but the problem is that %4Y is a glibc extension. There are platforms that return non-4-digit number and do not support %4Y. If we are going to guarantee 4 digits, the workaround may be much more complex.
On second thought, guaranteeing 4 digits is actually not complex since we can simply format the year with
"%04ld"usingsprintf, which works on all platforms.I've updated the PR accordingly so that a 4-digit year with century can now be guaranteed.
Reacted by martinvuyk- added a commit that references this issue
on Jun 24, 2024 51 remaining items
I'm not sure why but we are seeing failures on JIT for the
test_strftime_y2kon emulated Linux. Is it because emulated Linux have (yet) another weird case of glibc?Thanks for the heads-up. It is weird indeed that this can happen since according to the build log the configure script did detect that the platform would not 0-pad a century so the handler for
%Ywould format the year itself withsnprintfusing the"%04ld"format string.Since this happens only on
aarch64perhaps there is indeed some peculiarity ofsnprintfin the glibc of that platform.Will try debugging this on a Mac later.
Also, the reason we reverted the commits on 3.12 and 3.13 was because it was more of a feature than a bugfix?
It's a bug fix but was found to be incomplete, due to issue #122272.
Please open a new issue and provide more details.
See #123681.
Reacted by Serhiy Storchaka- added a commit that references this issue
on Jun 25, 2025 - added a commit that references this issue
on Oct 18, 2025 - added a commit that references this issue
on Jul 18, 2026 - added a commit that references this issue
on Oct 3, 2026
Metadata
Metadata
Assignees
Labels
Projects
- StatusShow more project fieldsDone
Bug report
Bug description:
docs say:
but this is what is happening
CPython versions tested on:
3.10
Operating systems tested on:
No response
Linked PRs