https://github.com/python/cpython/commit/e3d9bd6be384e8a0ae95f298747c90ef3260d12b
commit: e3d9bd6be384e8a0ae95f298747c90ef3260d12b
branch: main
author: Gordon P. Hemsley <[email protected]>
committer: pganssle <[email protected]>
date: 2025-09-19T10:23:12Z
summary:

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 <[email protected]>
Co-authored-by: Paul Ganssle <[email protected]>

files:
M Lib/_strptime.py
M Lib/test/datetimetester.py

diff --git a/Lib/_strptime.py b/Lib/_strptime.py
index a0117493954956..d011ddf8b181c3 100644
--- a/Lib/_strptime.py
+++ b/Lib/_strptime.py
@@ -627,18 +627,18 @@ def parse_int(s):
             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 55cf1fa6bee6c3..43cea44bc3d6c0 100644
--- a/Lib/test/datetimetester.py
+++ b/Lib/test/datetimetester.py
@@ -2942,6 +2942,16 @@ def test_strptime(self):
         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.
 

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]

Reply via email to