babel icon indicating copy to clipboard operation
babel copied to clipboard

`parse_time` raises when a format doesn't contain seconds

Open tomasr8 opened this issue 1 year ago • 1 comments

Overview Description

parse_time raises a ValueError when the given time format doesn't contain seconds e.g. H:mm.

Steps to Reproduce

>>> from babel.dates import parse_time
>>> parse_time('9:30', 'cs_CZ', 'short')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/dev/babel/babel/dates.py", line 1292, in parse_time
    sec_idx = format_str.index('s')
              ^^^^^^^^^^^^^^^^^^^^^
ValueError: substring not found

This happens because the parse_time function expects the format to have seconds, but some locales do not have those. For example this is the CLDR definition for the short format in Czech:

<timeFormatLength type="short">
	<timeFormat>
		<pattern>H:mm</pattern>
		<datetimeSkeleton>Hmm</datetimeSkeleton>
	</timeFormat>
</timeFormatLength>

I think the obvious fix is to make the seconds optional and default to zero.

tomasr8 avatar Sep 22 '24 13:09 tomasr8

@akx Let me know if this is worth fixing, happy to send a PR :)

tomasr8 avatar Sep 23 '24 16:09 tomasr8

@tomasr8 It definitely is worth fixing if a CLDR preset entry does this! We should also probably add more smoke tests to test all of the CLDR presets..?

akx avatar Oct 19 '24 12:10 akx

We should also probably add more smoke tests to test all of the CLDR presets..?

That would definitely be nice! I bet there are a lot of surprises lurking in some less used parts/locales of CLDR :smile:

tomasr8 avatar Oct 19 '24 21:10 tomasr8