python-babel / babel

The official repository for Babel, the Python Internationalization Library
http://babel.pocoo.org/
BSD 3-Clause "New" or "Revised" License
1.34k stars 448 forks source link

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

Closed tomasr8 closed 1 month ago

tomasr8 commented 2 months ago

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 commented 2 months ago

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

akx commented 1 month ago

@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..?

tomasr8 commented 1 month ago

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: