sdispater / pendulum

Python datetimes made easy
https://pendulum.eustace.io
MIT License
6.2k stars 383 forks source link

Error parsing ISO8601 duration with negative sign #532

Open jacobg opened 3 years ago

jacobg commented 3 years ago

For example, -PT8H is a valid IOS 8601 duration. But pendulum raises an error when trying to parse it.

>>> pendulum.parse('-PT8H')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/j/workspace/service-dev/p/env/lib/python3.7/site-packages/pendulum/parser.py", line 29, in parse
    return _parse(text, **options)
  File "/Users/j/workspace/service-dev/p/env/lib/python3.7/site-packages/pendulum/parser.py", line 45, in _parse
    parsed = base_parse(text, **options)
  File "/Users/j/workspace/service-dev/p/env/lib/python3.7/site-packages/pendulum/parsing/__init__.py", line 74, in parse
    return _normalize(_parse(text, **_options), **_options)
  File "/Users/j/workspace/service-dev/p/env/lib/python3.7/site-packages/pendulum/parsing/__init__.py", line 128, in _parse
    raise ParserError("Unable to parse string [{}]".format(text))
pendulum.parsing.exceptions.ParserError: Unable to parse string [-PT8H]
Flix6x commented 3 years ago

This would be a nice addition. Technically, ISO 8601 section 2.1.6 defines duration as a "non-negative quantity" (so afaik it is not a "valid" ISO8601 duration) but other libraries have consolidated negative durations nonetheless.