From 8a7240eeed609f747bdf38985679816ed9f61a0e Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sat, 12 Mar 2016 10:51:16 +0200 Subject: =?UTF-8?q?Issue=20#23718:=20Fixed=20parsing=20time=20in=20week=20?= =?UTF-8?q?0=20before=20Jan=201.=20=20Original=20patch=20by=20Tam=C3=A1s?= =?UTF-8?q?=20Bence=20Gedai.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Lib/_strptime.py | 4 ++++ Lib/test/test_strptime.py | 28 +++++++++++++++++++++------- Misc/ACKS | 1 + Misc/NEWS | 3 +++ 4 files changed, 29 insertions(+), 7 deletions(-) diff --git a/Lib/_strptime.py b/Lib/_strptime.py index b8cda76..f84227b 100644 --- a/Lib/_strptime.py +++ b/Lib/_strptime.py @@ -462,6 +462,10 @@ def _strptime(data_string, format="%a %b %d %H:%M:%S %Y"): 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 --git a/Lib/test/test_strptime.py b/Lib/test/test_strptime.py index 0319d5d..85126e6 100644 --- a/Lib/test/test_strptime.py +++ b/Lib/test/test_strptime.py @@ -496,14 +496,14 @@ class CalculationTests(unittest.TestCase): 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) @@ -511,6 +511,20 @@ class CalculationTests(unittest.TestCase): 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 --git a/Misc/ACKS b/Misc/ACKS index fed33c6..c8a6efd 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -484,6 +484,7 @@ Matthieu Gautier Stephen M. Gava Xavier de Gaye Harry Henry Gebel +Tamás Bence Gedai Marius Gedminas Jan-Philip Gehrcke Thomas Gellekum diff --git a/Misc/NEWS b/Misc/NEWS index 3d9a787..b5c34be 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -91,6 +91,9 @@ Core and Builtins Library ------- +- Issue #23718: Fixed parsing time in week 0 before Jan 1. Original patch by + Tamás Bence Gedai. + - Issue #20589: Invoking Path.owner() and Path.group() on Windows now raise NotImplementedError instead of ImportError. -- cgit v0.12