[Python-checkins] cpython (merge 3.5 -> default): Issue #23718: Fixed parsing time in week 0 before Jan 1. Original patch by

serhiy.storchaka python-checkins at python.org
Sat Mar 12 03:53:56 EST 2016


https://hg.python.org/cpython/rev/a7093386efaf
changeset:   100500:a7093386efaf
parent:      100497:e54224e8d6a9
parent:      100498:f03da87a79fa
user:        Serhiy Storchaka <storchaka at gmail.com>
date:        Sat Mar 12 10:53:09 2016 +0200
summary:
  Issue #23718: Fixed parsing time in week 0 before Jan 1.  Original patch by
Tamás Bence Gedai.

files:
  Lib/_strptime.py          |   4 +++
  Lib/test/test_strptime.py |  36 +++++++++++++++++++++-----
  Misc/NEWS                 |   3 ++
  3 files changed, 36 insertions(+), 7 deletions(-)


diff --git a/Lib/_strptime.py b/Lib/_strptime.py
--- a/Lib/_strptime.py
+++ b/Lib/_strptime.py
@@ -514,6 +514,10 @@
                                                 week_starts_Mon)
         elif iso_year is not None and iso_week is not None:
             year, julian = _calc_julian_from_V(iso_year, iso_week, weekday + 1)
+        if julian is not None and julian <= 0:
+            year -= 1
+            yday = 366 if calendar.isleap(year) else 365
+            julian += yday
 
     if julian is None:
         # Cannot pre-calculate datetime_date() since can change in Julian
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
@@ -520,17 +520,17 @@
     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 %U %w', 2014, 12, 28, 0, 0, 0, 6, 362)
         check('2015 0 0', '%Y %W %w', 2015, 1, 4, 0, 0, 0, 6, 4)
         check('2015 1 1', '%G %V %u', 2014, 12, 29, 0, 0, 0, 0, 363)
-        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 1', '%Y %U %w', 2014, 12, 29, 0, 0, 0, 0, 363)
+        check('2015 0 1', '%Y %W %w', 2014, 12, 29, 0, 0, 0, 0, 363)
         check('2015 1 2', '%G %V %u', 2014, 12, 30, 0, 0, 0, 1, 364)
-        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 2', '%Y %U %w', 2014, 12, 30, 0, 0, 0, 1, 364)
+        check('2015 0 2', '%Y %W %w', 2014, 12, 30, 0, 0, 0, 1, 364)
         check('2015 1 3', '%G %V %u', 2014, 12, 31, 0, 0, 0, 2, 365)
-        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 3', '%Y %U %w', 2014, 12, 31, 0, 0, 0, 2, 365)
+        check('2015 0 3', '%Y %W %w', 2014, 12, 31, 0, 0, 0, 2, 365)
         check('2015 1 4', '%G %V %u', 2015, 1, 1, 0, 0, 0, 3, 1)
         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)
@@ -542,6 +542,28 @@
         check('2015 0 6', '%Y %W %w', 2015, 1, 3, 0, 0, 0, 5, 3)
         check('2015 1 7', '%G %V %u', 2015, 1, 4, 0, 0, 0, 6, 4)
 
+        check('2009 0 0', '%Y %U %w', 2008, 12, 28, 0, 0, 0, 6, 363)
+        check('2009 0 0', '%Y %W %w', 2009, 1, 4, 0, 0, 0, 6, 4)
+        check('2009 1 1', '%G %V %u', 2008, 12, 29, 0, 0, 0, 0, 364)
+        check('2009 0 1', '%Y %U %w', 2008, 12, 29, 0, 0, 0, 0, 364)
+        check('2009 0 1', '%Y %W %w', 2008, 12, 29, 0, 0, 0, 0, 364)
+        check('2009 1 2', '%G %V %u', 2008, 12, 30, 0, 0, 0, 1, 365)
+        check('2009 0 2', '%Y %U %w', 2008, 12, 30, 0, 0, 0, 1, 365)
+        check('2009 0 2', '%Y %W %w', 2008, 12, 30, 0, 0, 0, 1, 365)
+        check('2009 1 3', '%G %V %u', 2008, 12, 31, 0, 0, 0, 2, 366)
+        check('2009 0 3', '%Y %U %w', 2008, 12, 31, 0, 0, 0, 2, 366)
+        check('2009 0 3', '%Y %W %w', 2008, 12, 31, 0, 0, 0, 2, 366)
+        check('2009 1 4', '%G %V %u', 2009, 1, 1, 0, 0, 0, 3, 1)
+        check('2009 0 4', '%Y %U %w', 2009, 1, 1, 0, 0, 0, 3, 1)
+        check('2009 0 4', '%Y %W %w', 2009, 1, 1, 0, 0, 0, 3, 1)
+        check('2009 1 5', '%G %V %u', 2009, 1, 2, 0, 0, 0, 4, 2)
+        check('2009 0 5', '%Y %U %w', 2009, 1, 2, 0, 0, 0, 4, 2)
+        check('2009 0 5', '%Y %W %w', 2009, 1, 2, 0, 0, 0, 4, 2)
+        check('2009 1 6', '%G %V %u', 2009, 1, 3, 0, 0, 0, 5, 3)
+        check('2009 0 6', '%Y %U %w', 2009, 1, 3, 0, 0, 0, 5, 3)
+        check('2009 0 6', '%Y %W %w', 2009, 1, 3, 0, 0, 0, 5, 3)
+        check('2009 1 7', '%G %V %u', 2009, 1, 4, 0, 0, 0, 6, 4)
+
 
 class CacheTests(unittest.TestCase):
     """Test that caching works properly."""
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -201,6 +201,9 @@
 Library
 -------
 
+- Issue #23718: Fixed parsing time in week 0 before Jan 1.  Original patch by
+  Tamás Bence Gedai.
+
 - Issue #26323: Add Mock.assert_called() and Mock.assert_called_once()
   methods to unittest.mock. Patch written by Amit Saha.
 

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list