From: Gordon P. Hemsley Date: Fri, 19 Sep 2025 10:23:12 +0000 (-0400) Subject: gh-81148: Eliminate unnecessary check in _strptime when determining AM/PM (#13428) X-Git-Tag: v3.15.0a1~257 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=e3d9bd6be384e8a0ae95f298747c90ef3260d12b;p=thirdparty%2FPython%2Fcpython.git gh-81148: Eliminate unnecessary check in _strptime when determining AM/PM (#13428) * bpo-36967: Eliminate unnecessary check in _strptime when determining AM/PM * Pauls suggestion to refactor test * Fix test --------- Co-authored-by: Stan Ulbrych <89152624+StanFromIreland@users.noreply.github.com> Co-authored-by: Paul Ganssle <1377457+pganssle@users.noreply.github.com> --- diff --git a/Lib/_strptime.py b/Lib/_strptime.py index a01174939549..d011ddf8b181 100644 --- a/Lib/_strptime.py +++ b/Lib/_strptime.py @@ -627,18 +627,18 @@ def _strptime(data_string, format="%a %b %d %H:%M:%S %Y"): hour = parse_int(found_dict['I']) ampm = found_dict.get('p', '').lower() # If there was no AM/PM indicator, we'll treat this like AM - if ampm in ('', locale_time.am_pm[0]): - # We're in AM so the hour is correct unless we're - # looking at 12 midnight. - # 12 midnight == 12 AM == hour 0 - if hour == 12: - hour = 0 - elif ampm == locale_time.am_pm[1]: + if ampm == locale_time.am_pm[1]: # We're in PM so we need to add 12 to the hour unless # we're looking at 12 noon. # 12 noon == 12 PM == hour 12 if hour != 12: hour += 12 + else: + # We're in AM so the hour is correct unless we're + # looking at 12 midnight. + # 12 midnight == 12 AM == hour 0 + if hour == 12: + hour = 0 elif group_key == 'M': minute = parse_int(found_dict['M']) elif group_key == 'S': diff --git a/Lib/test/datetimetester.py b/Lib/test/datetimetester.py index 55cf1fa6bee6..43cea44bc3d6 100644 --- a/Lib/test/datetimetester.py +++ b/Lib/test/datetimetester.py @@ -2942,6 +2942,16 @@ class TestDateTime(TestDate): with self.assertRaises(ValueError): strptime("-000", "%z") with self.assertRaises(ValueError): strptime("z", "%z") + def test_strptime_ampm(self): + dt = datetime(1999, 3, 17, 0, 44, 55, 2) + for hour in range(0, 24): + with self.subTest(hour=hour): + new_dt = dt.replace(hour=hour) + dt_str = new_dt.strftime("%I %p") + + self.assertEqual(self.theclass.strptime(dt_str, "%I %p").hour, + hour) + def test_strptime_single_digit(self): # bpo-34903: Check that single digit dates and times are allowed.