From: Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> Date: Thu, 20 May 2021 00:37:49 +0000 (-0700) Subject: bpo-43295: Fix error handling of datetime.strptime format string '%z' (GH-24627)... X-Git-Tag: v3.9.6~73 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=c87b81dcb2c22b6d151da39a0f65d5db304f59a8;p=thirdparty%2FPython%2Fcpython.git 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 Co-authored-by: Noor Michael --- diff --git a/Lib/_strptime.py b/Lib/_strptime.py index 5df37f5f4b89..b97dfcce1e8e 100644 --- a/Lib/_strptime.py +++ b/Lib/_strptime.py @@ -201,7 +201,7 @@ class TimeRE(dict): #XXX: Does 'Y' need to worry about having less or more than # 4 digits? 'Y': r"(?P\d\d\d\d)", - 'z': r"(?P[+-]\d\d:?[0-5]\d(:?[0-5]\d(\.\d{1,6})?)?|Z)", + 'z': r"(?P[+-]\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 b37ef9170787..a9c3a370e0e8 100644 --- a/Lib/test/datetimetester.py +++ b/Lib/test/datetimetester.py @@ -2609,6 +2609,7 @@ class TestDateTime(TestDate): 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 000000000000..ac9a5c96c9ce --- /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.