mirror of
https://github.com/python/cpython.git
synced 2026-06-28 03:41:13 +00:00
[3.15] gh-152305: Fix _pydatetime.time.strftime() raising on year directives (GH-152306) (#152425)
(cherry picked from commit 5733361fdd)
Co-authored-by: tonghuaroot (童话) <tonghuaroot@gmail.com>
Co-authored-by: Stan Ulbrych <stan@python.org>
This commit is contained in:
parent
592575ca7a
commit
bfb01d8a0c
3 changed files with 10 additions and 3 deletions
|
|
@ -272,12 +272,12 @@ def _wrap_strftime(object, format, timetuple):
|
|||
newformat.append(Zreplace)
|
||||
# Note that datetime(1000, 1, 1).strftime('%G') == '1000' so
|
||||
# year 1000 for %G can go on the fast path.
|
||||
elif ((ch in 'YG' or ch in 'FC') and
|
||||
object.year < 1000 and _need_normalize_century()):
|
||||
elif (ch in 'YGFC' and timetuple[0] < 1000 and
|
||||
_need_normalize_century()):
|
||||
if ch == 'G':
|
||||
year = int(_time.strftime("%G", timetuple))
|
||||
else:
|
||||
year = object.year
|
||||
year = timetuple[0]
|
||||
if ch == 'C':
|
||||
push('{:02}'.format(year // 100))
|
||||
else:
|
||||
|
|
|
|||
|
|
@ -4119,6 +4119,11 @@ def test_strftime_special(self):
|
|||
self.assertEqual(t.strftime('\0'*1000), '\0'*1000)
|
||||
self.assertEqual(t.strftime('\0%I%p%Z\0%X'), f'\0{s1}\0{s2}')
|
||||
self.assertEqual(t.strftime('%I%p%Z\0%X\0'), f'{s1}\0{s2}\0')
|
||||
# gh-152305: the year directives must not raise on a time.
|
||||
for directive, expected in (('%Y', '1900'), ('%G', '1900'),
|
||||
('%C', '19'), ('%F', '1900-01-01')):
|
||||
with self.subTest(directive=directive):
|
||||
self.assertEqual(t.strftime(directive), expected)
|
||||
|
||||
def test_format(self):
|
||||
t = self.theclass(1, 2, 3, 4)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,2 @@
|
|||
Fix the pure-Python :meth:`datetime.time.strftime` implementation raising :exc:`AttributeError` for the
|
||||
year directives. Patch by tonghuaroot.
|
||||
Loading…
Add table
Add a link
Reference in a new issue