changeset: 100499:4fb167ec3108 branch: 2.7 parent: 100486:1e7c388dc3c5 user: Serhiy Storchaka date: Sat Mar 12 10:51:16 2016 +0200 files: Lib/_strptime.py Lib/test/test_strptime.py Misc/ACKS Misc/NEWS description: Issue #23718: Fixed parsing time in week 0 before Jan 1. Original patch by Tamás Bence Gedai. diff -r 1e7c388dc3c5 -r 4fb167ec3108 Lib/_strptime.py --- a/Lib/_strptime.py Fri Mar 11 15:30:27 2016 -0500 +++ b/Lib/_strptime.py Sat Mar 12 10:51:16 2016 +0200 @@ -445,6 +445,10 @@ 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) + if julian <= 0: + year -= 1 + yday = 366 if calendar.isleap(year) else 365 + julian += yday # Cannot pre-calculate datetime_date() since can change in Julian # calculation and thus could have different value for the day of the week # calculation. diff -r 1e7c388dc3c5 -r 4fb167ec3108 Lib/test/test_strptime.py --- a/Lib/test/test_strptime.py Fri Mar 11 15:30:27 2016 -0500 +++ b/Lib/test/test_strptime.py Sat Mar 12 10:51:16 2016 +0200 @@ -486,14 +486,14 @@ 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 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 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 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 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 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) @@ -501,6 +501,20 @@ 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) + 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 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 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 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 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 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 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) class CacheTests(unittest.TestCase): """Test that caching works properly.""" diff -r 1e7c388dc3c5 -r 4fb167ec3108 Misc/ACKS --- a/Misc/ACKS Fri Mar 11 15:30:27 2016 -0500 +++ b/Misc/ACKS Sat Mar 12 10:51:16 2016 +0200 @@ -466,6 +466,7 @@ Stephen M. Gava Xavier de Gaye Harry Henry Gebel +Tamás Bence Gedai Marius Gedminas Thomas Gellekum Gabriel Genellina diff -r 1e7c388dc3c5 -r 4fb167ec3108 Misc/NEWS --- a/Misc/NEWS Fri Mar 11 15:30:27 2016 -0500 +++ b/Misc/NEWS Sat Mar 12 10:51:16 2016 +0200 @@ -58,6 +58,9 @@ Library ------- +- Issue #23718: Fixed parsing time in week 0 before Jan 1. Original patch by + Tamás Bence Gedai. + - Issue #26177: Fixed the keys() method for Canvas and Scrollbar widgets. - Issue #15068: Got rid of excessive buffering in the fileinput module.