mirror of
https://github.com/python/cpython.git
synced 2025-07-07 19:35:27 +00:00
GH-70647: Deprecate strptime day of month parsing without a year present to avoid leap-year bugs (GH-117107)
This commit is contained in:
parent
595bb496b0
commit
33ee5cb3e9
7 changed files with 117 additions and 1 deletions
|
@ -10,6 +10,7 @@ FUNCTIONS:
|
|||
strptime -- Calculates the time struct represented by the passed-in string
|
||||
|
||||
"""
|
||||
import os
|
||||
import time
|
||||
import locale
|
||||
import calendar
|
||||
|
@ -250,12 +251,30 @@ class TimeRE(dict):
|
|||
format = regex_chars.sub(r"\\\1", format)
|
||||
whitespace_replacement = re_compile(r'\s+')
|
||||
format = whitespace_replacement.sub(r'\\s+', format)
|
||||
year_in_format = False
|
||||
day_of_month_in_format = False
|
||||
while '%' in format:
|
||||
directive_index = format.index('%')+1
|
||||
format_char = format[directive_index]
|
||||
processed_format = "%s%s%s" % (processed_format,
|
||||
format[:directive_index-1],
|
||||
self[format[directive_index]])
|
||||
self[format_char])
|
||||
format = format[directive_index+1:]
|
||||
match format_char:
|
||||
case 'Y' | 'y' | 'G':
|
||||
year_in_format = True
|
||||
case 'd':
|
||||
day_of_month_in_format = True
|
||||
if day_of_month_in_format and not year_in_format:
|
||||
import warnings
|
||||
warnings.warn("""\
|
||||
Parsing dates involving a day of month without a year specified is ambiguious
|
||||
and fails to parse leap day. The default behavior will change in Python 3.15
|
||||
to either always raise an exception or to use a different default year (TBD).
|
||||
To avoid trouble, add a specific year to the input & format.
|
||||
See https://github.com/python/cpython/issues/70647.""",
|
||||
DeprecationWarning,
|
||||
skip_file_prefixes=(os.path.dirname(__file__),))
|
||||
return "%s%s" % (processed_format, format)
|
||||
|
||||
def compile(self, format):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue