From 5db1e150a78033d8879bbe9b5f41ebe67b3a44c8 Mon Sep 17 00:00:00 2001 From: Simon Schmid Date: Mon, 7 Jan 2019 20:47:28 +0100 Subject: [PATCH] fixes #619 wrong weeknumber for 31.12.2018 The weeknumber was calculated to 53, but by definition the value must compute to 1. the fix will compute the weeknumber by using date.isocalendar if locale.first_week_day == 0. Also the computation of the year format 'YYYY' is replaced by isocalendar. Tests added. --- babel/dates.py | 13 +++++++++---- tests/test_dates.py | 9 +++++++++ 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/babel/dates.py b/babel/dates.py index 4bae3eaa0..39ce3dc1e 100644 --- a/babel/dates.py +++ b/babel/dates.py @@ -1319,9 +1319,7 @@ def format_era(self, char, num): def format_year(self, char, num): value = self.value.year if char.isupper(): - week = self.get_week_number(self.get_day_of_year()) - if week == 0: - value -= 1 + value = self.value.isocalendar()[0] year = self.format(value, num) if num == 2: year = year[-2:] @@ -1505,8 +1503,15 @@ def get_week_number(self, day_of_period, day_of_week=None): if first_day < 0: first_day += 7 week_number = (day_of_period + first_day - 1) // 7 + if 7 - first_day >= self.locale.min_week_days: - week_number += 1 + week_number = (week_number +1) + + if self.locale.first_week_day == 0: + max_weeks = date(year=self.value.year, day=28, month=12).isocalendar()[1] + if week_number > max_weeks: + week_number -= max_weeks + return week_number diff --git a/tests/test_dates.py b/tests/test_dates.py index b8c293ba6..d77c0ea42 100644 --- a/tests/test_dates.py +++ b/tests/test_dates.py @@ -79,6 +79,15 @@ def test_week_of_year_last_us_extra_week(self): fmt = dates.DateTimeFormat(d, locale='en_US') self.assertEqual('53', fmt['w']) + def test_week_of_year_de_first_us_last_with_year(self): + d = date(2018,12,31) + fmt = dates.DateTimeFormat(d, locale='de_DE') + self.assertEqual('1', fmt['w']) + self.assertEqual('2019', fmt['YYYY']) + fmt = dates.DateTimeFormat(d, locale='en_US') + self.assertEqual('53', fmt['w']) + self.assertEqual('2018',fmt['yyyy']) + def test_week_of_month_first(self): d = date(2006, 1, 8) fmt = dates.DateTimeFormat(d, locale='de_DE')