[Python-checkins] bpo-43295: Fix error handling of datetime.strptime format string '%z' (GH-24627) (#25695)

pganssle webhook-mailer at python.org
Wed May 19 20:37:58 EDT 2021


https://github.com/python/cpython/commit/c87b81dcb2c22b6d151da39a0f65d5db304f59a8
commit: c87b81dcb2c22b6d151da39a0f65d5db304f59a8
branch: 3.9
author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com>
committer: pganssle <p.ganssle at gmail.com>
date: 2021-05-19T20:37:49-04:00
summary:

bpo-43295: Fix error handling of datetime.strptime format string '%z' (GH-24627) (#25695)

Previously, `datetime.strptime` would match `'z'` with the format string `'%z'` (for UTC offsets), throwing an `IndexError` by erroneously trying to parse `'z'` as a timestamp. As a special case, `'%z'` matches the string `'Z'` which is equivalent to the offset `'+00:00'`, however this behavior is not defined for lowercase `'z'`.

This change ensures a `ValueError` is thrown when encountering the original example, as follows:

```
>>> from datetime import datetime
>>> datetime.strptime('z', '%z')
ValueError: time data 'z' does not match format '%z'
```

Automerge-Triggered-By: GH:pganssle
(cherry picked from commit 04f6fbb6969e9860783b9ab4dc24b6fe3c6dab8d)

Co-authored-by: Noor Michael <nsmichael31 at gmail.com>

Co-authored-by: Noor Michael <nsmichael31 at gmail.com>

files:
A Misc/NEWS.d/next/Library/2021-02-22-22-54-40.bpo-43295.h_ffu7.rst
M Lib/_strptime.py
M Lib/test/datetimetester.py

diff --git a/Lib/_strptime.py b/Lib/_strptime.py
index 5df37f5f4b89d5..b97dfcce1e8e4d 100644
--- a/Lib/_strptime.py
+++ b/Lib/_strptime.py
@@ -201,7 +201,7 @@ def __init__(self, locale_time=None):
             #XXX: Does 'Y' need to worry about having less or more than
             #     4 digits?
             'Y': r"(?P<Y>\d\d\d\d)",
-            'z': r"(?P<z>[+-]\d\d:?[0-5]\d(:?[0-5]\d(\.\d{1,6})?)?|Z)",
+            'z': r"(?P<z>[+-]\d\d:?[0-5]\d(:?[0-5]\d(\.\d{1,6})?)?|(?-i:Z))",
             'A': self.__seqToRE(self.locale_time.f_weekday, 'A'),
             'a': self.__seqToRE(self.locale_time.a_weekday, 'a'),
             'B': self.__seqToRE(self.locale_time.f_month[1:], 'B'),
diff --git a/Lib/test/datetimetester.py b/Lib/test/datetimetester.py
index b37ef917078723..a9c3a370e0e838 100644
--- a/Lib/test/datetimetester.py
+++ b/Lib/test/datetimetester.py
@@ -2609,6 +2609,7 @@ def test_strptime(self):
 
         with self.assertRaises(ValueError): strptime("-2400", "%z")
         with self.assertRaises(ValueError): strptime("-000", "%z")
+        with self.assertRaises(ValueError): strptime("z", "%z")
 
     def test_strptime_single_digit(self):
         # bpo-34903: Check that single digit dates and times are allowed.
diff --git a/Misc/NEWS.d/next/Library/2021-02-22-22-54-40.bpo-43295.h_ffu7.rst b/Misc/NEWS.d/next/Library/2021-02-22-22-54-40.bpo-43295.h_ffu7.rst
new file mode 100644
index 00000000000000..ac9a5c96c9cedd
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2021-02-22-22-54-40.bpo-43295.h_ffu7.rst
@@ -0,0 +1,2 @@
+:meth:`datetime.datetime.strptime` now raises ``ValueError`` instead of
+``IndexError`` when matching ``'z'`` with the ``%z`` format specifier.



More information about the Python-checkins mailing list