mirror of
https://github.com/python/cpython.git
synced 2025-11-27 13:45:25 +00:00
Issue #23136: _strptime now uniformly handles all days in week 0, including
Jan 30 of previous year. Based on patch by Jim Carroll.
This commit is contained in:
commit
fc7344a792
3 changed files with 26 additions and 5 deletions
|
|
@ -348,9 +348,9 @@ def _strptime(data_string, format="%a %b %d %H:%M:%S %Y"):
|
||||||
# though
|
# though
|
||||||
week_of_year = -1
|
week_of_year = -1
|
||||||
week_of_year_start = -1
|
week_of_year_start = -1
|
||||||
# weekday and julian defaulted to -1 so as to signal need to calculate
|
# weekday and julian defaulted to None so as to signal need to calculate
|
||||||
# values
|
# values
|
||||||
weekday = julian = -1
|
weekday = julian = None
|
||||||
found_dict = found.groupdict()
|
found_dict = found.groupdict()
|
||||||
for group_key in found_dict.keys():
|
for group_key in found_dict.keys():
|
||||||
# Directives not explicitly handled below:
|
# Directives not explicitly handled below:
|
||||||
|
|
@ -452,14 +452,14 @@ def _strptime(data_string, format="%a %b %d %H:%M:%S %Y"):
|
||||||
year = 1900
|
year = 1900
|
||||||
# If we know the week of the year and what day of that week, we can figure
|
# If we know the week of the year and what day of that week, we can figure
|
||||||
# out the Julian day of the year.
|
# out the Julian day of the year.
|
||||||
if julian == -1 and week_of_year != -1 and weekday != -1:
|
if julian is None and week_of_year != -1 and weekday is not None:
|
||||||
week_starts_Mon = True if week_of_year_start == 0 else False
|
week_starts_Mon = True if week_of_year_start == 0 else False
|
||||||
julian = _calc_julian_from_U_or_W(year, week_of_year, weekday,
|
julian = _calc_julian_from_U_or_W(year, week_of_year, weekday,
|
||||||
week_starts_Mon)
|
week_starts_Mon)
|
||||||
# Cannot pre-calculate datetime_date() since can change in Julian
|
# Cannot pre-calculate datetime_date() since can change in Julian
|
||||||
# calculation and thus could have different value for the day of the week
|
# calculation and thus could have different value for the day of the week
|
||||||
# calculation.
|
# calculation.
|
||||||
if julian == -1:
|
if julian is None:
|
||||||
# Need to add 1 to result since first day of the year is 1, not 0.
|
# Need to add 1 to result since first day of the year is 1, not 0.
|
||||||
julian = datetime_date(year, month, day).toordinal() - \
|
julian = datetime_date(year, month, day).toordinal() - \
|
||||||
datetime_date(year, 1, 1).toordinal() + 1
|
datetime_date(year, 1, 1).toordinal() + 1
|
||||||
|
|
@ -469,7 +469,7 @@ def _strptime(data_string, format="%a %b %d %H:%M:%S %Y"):
|
||||||
year = datetime_result.year
|
year = datetime_result.year
|
||||||
month = datetime_result.month
|
month = datetime_result.month
|
||||||
day = datetime_result.day
|
day = datetime_result.day
|
||||||
if weekday == -1:
|
if weekday is None:
|
||||||
weekday = datetime_date(year, month, day).weekday()
|
weekday = datetime_date(year, month, day).weekday()
|
||||||
# Add timezone info
|
# Add timezone info
|
||||||
tzname = found_dict.get("Z")
|
tzname = found_dict.get("Z")
|
||||||
|
|
|
||||||
|
|
@ -494,6 +494,24 @@ class CalculationTests(unittest.TestCase):
|
||||||
test_helper((2006, 12, 31), "Last Sunday of 2006")
|
test_helper((2006, 12, 31), "Last Sunday of 2006")
|
||||||
test_helper((2006, 12, 24), "Second to last Sunday of 2006")
|
test_helper((2006, 12, 24), "Second to last Sunday of 2006")
|
||||||
|
|
||||||
|
def test_week_0(self):
|
||||||
|
def check(value, format, *expected):
|
||||||
|
self.assertEqual(_strptime._strptime_time(value, format)[:-1], expected)
|
||||||
|
check('2015 0 0', '%Y %U %w', 2014, 12, 28, 0, 0, 0, 6, -3)
|
||||||
|
check('2015 0 0', '%Y %W %w', 2015, 1, 4, 0, 0, 0, 6, 4)
|
||||||
|
check('2015 0 1', '%Y %U %w', 2014, 12, 29, 0, 0, 0, 0, -2)
|
||||||
|
check('2015 0 1', '%Y %W %w', 2014, 12, 29, 0, 0, 0, 0, -2)
|
||||||
|
check('2015 0 2', '%Y %U %w', 2014, 12, 30, 0, 0, 0, 1, -1)
|
||||||
|
check('2015 0 2', '%Y %W %w', 2014, 12, 30, 0, 0, 0, 1, -1)
|
||||||
|
check('2015 0 3', '%Y %U %w', 2014, 12, 31, 0, 0, 0, 2, 0)
|
||||||
|
check('2015 0 3', '%Y %W %w', 2014, 12, 31, 0, 0, 0, 2, 0)
|
||||||
|
check('2015 0 4', '%Y %U %w', 2015, 1, 1, 0, 0, 0, 3, 1)
|
||||||
|
check('2015 0 4', '%Y %W %w', 2015, 1, 1, 0, 0, 0, 3, 1)
|
||||||
|
check('2015 0 5', '%Y %U %w', 2015, 1, 2, 0, 0, 0, 4, 2)
|
||||||
|
check('2015 0 5', '%Y %W %w', 2015, 1, 2, 0, 0, 0, 4, 2)
|
||||||
|
check('2015 0 6', '%Y %U %w', 2015, 1, 3, 0, 0, 0, 5, 3)
|
||||||
|
check('2015 0 6', '%Y %W %w', 2015, 1, 3, 0, 0, 0, 5, 3)
|
||||||
|
|
||||||
|
|
||||||
class CacheTests(unittest.TestCase):
|
class CacheTests(unittest.TestCase):
|
||||||
"""Test that caching works properly."""
|
"""Test that caching works properly."""
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,9 @@ Core and Builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #23136: _strptime now uniformly handles all days in week 0, including
|
||||||
|
Jan 30 of previous year. Based on patch by Jim Carroll.
|
||||||
|
|
||||||
- Issue #23700: Iterator of NamedTemporaryFile now keeps a reference to
|
- Issue #23700: Iterator of NamedTemporaryFile now keeps a reference to
|
||||||
NamedTemporaryFile instance. Patch by Bohuslav Kabrda.
|
NamedTemporaryFile instance. Patch by Bohuslav Kabrda.
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue