summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2015-03-19 17:13:25 (GMT)
committerSerhiy Storchaka <storchaka@gmail.com>2015-03-19 17:13:25 (GMT)
commitd54c2e3f133a772dc71cc776a476face4c90389a (patch)
tree5801b0f9f764c13b1132cf280a3049c6b5b83602
parent6a74a51b28979e71e8ae7d79e7cb06d49e67ac07 (diff)
downloadcpython-d54c2e3f133a772dc71cc776a476face4c90389a.zip
cpython-d54c2e3f133a772dc71cc776a476face4c90389a.tar.gz
cpython-d54c2e3f133a772dc71cc776a476face4c90389a.tar.bz2
Issue #23136: _strptime now uniformly handles all days in week 0, including
Jan 30 of previous year. Based on patch by Jim Carroll.
-rw-r--r--Lib/_strptime.py10
-rw-r--r--Lib/test/test_strptime.py18
-rw-r--r--Misc/NEWS3
3 files changed, 26 insertions, 5 deletions
diff --git a/Lib/_strptime.py b/Lib/_strptime.py
index 042db6f..1bd570d 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 66b9ab3..7a47f9e 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 ac03bf7..7d29d13 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.