summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAarni Koskela <akx@iki.fi>2022-05-10 13:55:39 +0200
committerGitHub <noreply@github.com>2022-05-10 13:55:39 +0200
commitd0ec73dcfb153823a12f8f94871849b6cd9fece9 (patch)
tree9b8b0395ee97b1022dabc1566bad17d9fe6576da
parent53a74f1c1567b28e6e23bb1ab48ca3a0f888d307 (diff)
parent38a0e42f5ed756dce41ad45801bf702b5404e69a (diff)
downloadbabel-d0ec73dcfb153823a12f8f94871849b6cd9fece9.tar.gz
Merge pull request #869 from jun66j5/date-period-symbols
Add support for `b` and `B` period symbols in time format
-rw-r--r--babel/dates.py49
-rw-r--r--tests/test_dates.py2
2 files changed, 42 insertions, 9 deletions
diff --git a/babel/dates.py b/babel/dates.py
index 6e049e9..c8a5a88 100644
--- a/babel/dates.py
+++ b/babel/dates.py
@@ -1327,9 +1327,8 @@ class DateTimeFormat:
return self.format_day_of_week_in_month()
elif char in ('E', 'e', 'c'):
return self.format_weekday(char, num)
- elif char == 'a':
- # TODO: Add support for the rest of the period formats (a*, b*, B*)
- return self.format_period(char)
+ elif char in ('a', 'b', 'B'):
+ return self.format_period(char, num)
elif char == 'h':
if self.value.hour % 12 == 0:
return self.format(12, num)
@@ -1467,10 +1466,44 @@ class DateTimeFormat:
def format_day_of_week_in_month(self):
return '%d' % ((self.value.day - 1) // 7 + 1)
- def format_period(self, char):
- period = {0: 'am', 1: 'pm'}[int(self.value.hour >= 12)]
- for width in ('wide', 'narrow', 'abbreviated'):
- period_names = get_period_names(context='format', width=width, locale=self.locale)
+ def format_period(self, char, num):
+ """
+ Return period from parsed datetime according to format pattern.
+
+ >>> format = DateTimeFormat(time(13, 42), 'fi_FI')
+ >>> format.format_period('a', 1)
+ u'ip.'
+ >>> format.format_period('b', 1)
+ u'iltap.'
+ >>> format.format_period('b', 4)
+ u'iltapäivä'
+ >>> format.format_period('B', 4)
+ u'iltapäivällä'
+ >>> format.format_period('B', 5)
+ u'ip.'
+
+ >>> format = DateTimeFormat(datetime(2022, 4, 28, 6, 27), 'zh_Hant')
+ >>> format.format_period('a', 1)
+ u'上午'
+ >>> format.format_period('b', 1)
+ u'清晨'
+ >>> format.format_period('B', 1)
+ u'清晨'
+
+ :param char: pattern format character ('a', 'b', 'B')
+ :param num: count of format character
+
+ """
+ widths = [{3: 'abbreviated', 4: 'wide', 5: 'narrow'}[max(3, num)],
+ 'wide', 'narrow', 'abbreviated']
+ if char == 'a':
+ period = 'pm' if self.value.hour >= 12 else 'am'
+ context = 'format'
+ else:
+ period = get_period_id(self.value, locale=self.locale)
+ context = 'format' if char == 'B' else 'stand-alone'
+ for width in widths:
+ period_names = get_period_names(context=context, width=width, locale=self.locale)
if period in period_names:
return period_names[period]
raise ValueError('Could not format period %s in %s' % (period, self.locale))
@@ -1593,7 +1626,7 @@ PATTERN_CHARS = {
'w': [1, 2], 'W': [1], # week
'd': [1, 2], 'D': [1, 2, 3], 'F': [1], 'g': None, # day
'E': [1, 2, 3, 4, 5, 6], 'e': [1, 2, 3, 4, 5, 6], 'c': [1, 3, 4, 5, 6], # week day
- 'a': [1], # period
+ 'a': [1, 2, 3, 4, 5], 'b': [1, 2, 3, 4, 5], 'B': [1, 2, 3, 4, 5], # period
'h': [1, 2], 'H': [1, 2], 'K': [1, 2], 'k': [1, 2], # hour
'm': [1, 2], # minute
's': [1, 2], 'S': None, 'A': None, # second
diff --git a/tests/test_dates.py b/tests/test_dates.py
index 6a24ed4..a84fac9 100644
--- a/tests/test_dates.py
+++ b/tests/test_dates.py
@@ -833,7 +833,7 @@ def test_lithuanian_long_format():
def test_zh_TW_format():
# Refs GitHub issue #378
- assert dates.format_time(datetime(2016, 4, 8, 12, 34, 56), locale='zh_TW') == u'B12:34:56'
+ assert dates.format_time(datetime(2016, 4, 8, 12, 34, 56), locale='zh_TW') == u'中午12:34:56'
def test_format_current_moment():