Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 10 additions & 2 deletions babel/dates.py
Original file line number Diff line number Diff line change
Expand Up @@ -1303,7 +1303,11 @@ def parse_date(
fmt = get_date_format(format=format, locale=locale)
else:
fmt = parse_pattern(format)
format_str = fmt.pattern.lower()
format_str = ''.join(
field[0].lower()
for token_type, field in tokenize_pattern(fmt.pattern)
if token_type == 'field'
)
year_idx = format_str.index('y')
month_idx = format_str.find('m')
if month_idx < 0:
Expand Down Expand Up @@ -1360,7 +1364,11 @@ def parse_time(
fmt = get_time_format(format=format, locale=locale)
else:
fmt = parse_pattern(format)
format_str = fmt.pattern.lower()
format_str = ''.join(
field[0].lower()
for token_type, field in tokenize_pattern(fmt.pattern)
if token_type == 'field'
)
hour_idx = format_str.find('h')
if hour_idx < 0:
hour_idx = format_str.index('k')
Expand Down
24 changes: 24 additions & 0 deletions tests/test_dates.py
Original file line number Diff line number Diff line change
Expand Up @@ -524,6 +524,30 @@ def get_date_format(*args, **kwargs):
assert dates.parse_date('2024-10-20') == date(2024, 10, 20)


@pytest.mark.parametrize(
('pattern', 'value'),
[
("yyyy 'day' MM dd", '2024 day 04 01'),
("'day:' yyyy-MM-dd", 'day: 2024-04-01'),
("yyyy 'day''s month' MM dd", "2024 day's month 04 01"),
],
)
def test_parse_date_quoted_fields(pattern, value):
assert dates.parse_date(value, format=pattern) == date(2024, 4, 1)


@pytest.mark.parametrize(
('pattern', 'value', 'expected'),
[
("'seconds:' HH:mm:ss", 'seconds: 15:30:45', time(15, 30, 45)),
("'minutes:' HH:mm:ss", 'minutes: 15:30:45', time(15, 30, 45)),
("'at' HH:mm 'pm'", 'at 03:30 pm', time(3, 30)),
],
)
def test_parse_time_quoted_fields(pattern, value, expected):
assert dates.parse_time(value, format=pattern) == expected


def test_parse_time_custom_format():
assert dates.parse_time('15:30:00', format='HH:mm:ss') == time(15, 30)
assert dates.parse_time('00:30:15', format='ss:mm:HH') == time(15, 30)
Expand Down