From 7e4f07ffc9dbd4385427ab73d5e3f72b26fedd10 Mon Sep 17 00:00:00 2001 From: Cristian Ramirez <62491943+Str0k@users.noreply.github.com> Date: Fri, 11 Sep 2026 22:28:42 -0500 Subject: [PATCH] Ignore quoted literals when selecting date and time fields Co-authored-by: Codex --- babel/dates.py | 12 ++++++++++-- tests/test_dates.py | 24 ++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/babel/dates.py b/babel/dates.py index 7b626aa11..2e8e89b1f 100644 --- a/babel/dates.py +++ b/babel/dates.py @@ -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: @@ -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') diff --git a/tests/test_dates.py b/tests/test_dates.py index 4f8c73907..dd8ce2409 100644 --- a/tests/test_dates.py +++ b/tests/test_dates.py @@ -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)