# HG changeset patch # User cmlenz # Date 1186522895 0 # Node ID cfb4cb07cbc72a62f0809b7b7982de5e2a7312de # Parent 2ed73d964211f06ac80decff4c22b7121da52237 Finish implementation of day-of-year and day-of-month for now, and fix implementation of year-of-week-of-year field. Closes #46. I suspect there are still cases not entirely covered by this implementation, but those can be filed as separate tickets. diff --git a/babel/dates.py b/babel/dates.py --- a/babel/dates.py +++ b/babel/dates.py @@ -730,10 +730,11 @@ return get_era_names(width, self.locale)[era] def format_year(self, char, num): - if char.islower(): - value = self.value.year - else: - value = self.value.isocalendar()[0] + value = self.value.year + if char.isupper(): + week = self.get_week_number(self.get_day_of_year()) + if week == 0: + value -= 1 year = self.format(value, num) if num == 2: year = year[-2:] @@ -748,17 +749,18 @@ def format_week(self, char, num): if char.islower(): # week of year - week = self.get_week_number(self.get_day_of_year()) + day_of_year = self.get_day_of_year() + week = self.get_week_number(day_of_year) if week == 0: - # FIXME: I suppose this should return the last week number of - # the previous year - pass + date = self.value - timedelta(days=day_of_year) + week = self.get_week_number(self.get_day_of_year(date), + date.weekday()) return self.format(week, num) else: # week of month week = self.get_week_number(self.value.day) if week == 0: - # FIXME: I suppose this should return the last week number of - # the previous month + date = self.value - timedelta(days=self.value.day) + week = self.get_week_number(date.day, date.weekday()) pass return '%d' % week @@ -810,10 +812,12 @@ def format(self, value, length): return ('%%0%dd' % length) % value - def get_day_of_year(self): - return (self.value - date(self.value.year, 1, 1)).days + 1 + def get_day_of_year(self, date=None): + if date is None: + date = self.value + return (date - date_(date.year, 1, 1)).days + 1 - def get_week_number(self, day_of_period): + def get_week_number(self, day_of_period, day_of_week=None): """Return the number of the week of a day within a period. This may be the week number in a year or the week number in a month. @@ -831,8 +835,12 @@ :param day_of_period: the number of the day in the period (usually either the day of month or the day of year) + :param day_of_week: the week day; if ommitted, the week day of the + current date is assumed """ - first_day = (self.value.weekday() - self.locale.first_week_day - + if day_of_week is None: + day_of_week = self.value.weekday() + first_day = (day_of_week - self.locale.first_week_day - day_of_period + 1) % 7 if first_day < 0: first_day += 7 diff --git a/babel/tests/dates.py b/babel/tests/dates.py --- a/babel/tests/dates.py +++ b/babel/tests/dates.py @@ -29,6 +29,12 @@ fmt = dates.DateTimeFormat(d, locale='en_US') self.assertEqual('02', fmt['ww']) + def test_week_of_year_first_with_year(self): + d = date(2006, 1, 1) + fmt = dates.DateTimeFormat(d, locale='de_DE') + self.assertEqual('52', fmt['w']) + self.assertEqual('2005', fmt['YYYY']) + def test_week_of_year_last(self): d = date(2005, 12, 26) fmt = dates.DateTimeFormat(d, locale='de_DE')