From d54c2e3f133a772dc71cc776a476face4c90389a Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Thu, 19 Mar 2015 19:13:25 +0200 Subject: [PATCH] Issue #23136: _strptime now uniformly handles all days in week 0, including Jan 30 of previous year. Based on patch by Jim Carroll. --- Lib/_strptime.py | 10 +++++----- Lib/test/test_strptime.py | 18 ++++++++++++++++++ Misc/NEWS | 3 +++ 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/Lib/_strptime.py b/Lib/_strptime.py index 042db6f4f0..1bd570d65a 100644 --- a/Lib/_strptime.py +++ b/Lib/_strptime.py @@ -335,9 +335,9 @@ def _strptime(data_string, format="%a %b %d %H:%M:%S %Y"): # though week_of_year = -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 - weekday = julian = -1 + weekday = julian = None found_dict = found.groupdict() for group_key in found_dict.iterkeys(): # Directives not explicitly handled below: @@ -434,14 +434,14 @@ def _strptime(data_string, format="%a %b %d %H:%M:%S %Y"): year = 1900 # If we know the week of the year and what day of that week, we can figure # 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 julian = _calc_julian_from_U_or_W(year, week_of_year, weekday, week_starts_Mon) # Cannot pre-calculate datetime_date() since can change in Julian # calculation and thus could have different value for the day of the week # calculation. - if julian == -1: + if julian is None: # Need to add 1 to result since first day of the year is 1, not 0. julian = datetime_date(year, month, day).toordinal() - \ datetime_date(year, 1, 1).toordinal() + 1 @@ -451,7 +451,7 @@ def _strptime(data_string, format="%a %b %d %H:%M:%S %Y"): year = datetime_result.year month = datetime_result.month day = datetime_result.day - if weekday == -1: + if weekday is None: weekday = datetime_date(year, month, day).weekday() if leap_year_fix: # the caller didn't supply a year but asked for Feb 29th. We couldn't diff --git a/Lib/test/test_strptime.py b/Lib/test/test_strptime.py index 66b9ab3b16..7a47f9eb10 100644 --- a/Lib/test/test_strptime.py +++ b/Lib/test/test_strptime.py @@ -484,6 +484,24 @@ class CalculationTests(unittest.TestCase): test_helper((2006, 12, 31), "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): """Test that caching works properly.""" diff --git a/Misc/NEWS b/Misc/NEWS index ac03bf7986..7d29d13969 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -21,6 +21,9 @@ Core and Builtins 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 #23138: Fixed parsing cookies with absent keys or values in cookiejar. Patch by Demian Brecht. -- 2.50.1