From bb7e8c7715ae0f96ff09a86b4c7894386918aa67 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 | 11 ++++++++--- tests/test_dates.py | 9 +++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/babel/dates.py b/babel/dates.py index 4bae3eaa0..26ccd120a 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 + + 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')