[Python-checkins] cpython (merge 3.4 -> default): Issue #23136: _strptime now uniformly handles all days in week 0, including

serhiy.storchaka python-checkins at python.org
Thu Mar 19 18:15:06 CET 2015


https://hg.python.org/cpython/rev/750c6d53890a
changeset: 95064:750c6d53890a
parent: 95061:c84a0b35999a
parent: 95063:93e1da502338
user: Serhiy Storchaka <storchaka at gmail.com>
date: Thu Mar 19 19:14:15 2015 +0200
summary:
 Issue #23136: _strptime now uniformly handles all days in week 0, including
Jan 30 of previous year. Based on patch by Jim Carroll.
files:
 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
--- a/Lib/_strptime.py
+++ b/Lib/_strptime.py
@@ -348,9 +348,9 @@
 # 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.keys():
 # Directives not explicitly handled below:
@@ -452,14 +452,14 @@
 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
@@ -469,7 +469,7 @@
 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()
 # Add timezone info
 tzname = found_dict.get("Z")
diff --git a/Lib/test/test_strptime.py b/Lib/test/test_strptime.py
--- a/Lib/test/test_strptime.py
+++ b/Lib/test/test_strptime.py
@@ -494,6 +494,24 @@
 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
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -18,6 +18,9 @@
 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
 NamedTemporaryFile instance. Patch by Bohuslav Kabrda.
 
-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /