scrapinghub / dateparser

python parser for human readable dates
BSD 3-Clause "New" or "Revised" License
2.56k stars 465 forks source link

Parse some abbreviated strings as relative dates #1219

Closed Dunedan closed 9 months ago

Dunedan commented 9 months ago

dateparser so far did consider strings like "1h20m" as an absolute time. This commit changes that, so "1h20" remains an absolute time, while "1h20m" is now considered a relative date. This makes the output much more predictable and not dependent on the use of whitespaces anymore.

Fixes #1012

Behavior before the changes:

>>> from datetime import datetime
>>> import dateparser
>>> ref_date = datetime(2023, 1, 2, 3, 4, 5)
>>> dateparser.parse("1h20", settings={"RELATIVE_BASE": ref_date})
datetime.datetime(2023, 1, 2, 1, 20)
>>> dateparser.parse("1h20m", settings={"RELATIVE_BASE": ref_date})
datetime.datetime(2023, 1, 2, 1, 20)
>>> dateparser.parse("1h 20m", settings={"RELATIVE_BASE": ref_date})
datetime.datetime(2023, 1, 2, 1, 44, 5)
>>> dateparser.parse("1h20m", settings={"RELATIVE_BASE": ref_date,
                                        "PREFER_DATES_FROM": "future"})
datetime.datetime(2023, 1, 3, 1, 20)

Behavior after the changes:

>>> from datetime import datetime
>>> import dateparser
>>> ref_date = datetime(2023, 1, 2, 3, 4, 5)
>>> dateparser.parse("1h20", settings={"RELATIVE_BASE": ref_date})
datetime.datetime(2023, 1, 2, 1, 20)
>>> dateparser.parse("1h20m", settings={"RELATIVE_BASE": ref_date})
datetime.datetime(2023, 1, 2, 1, 44, 5)
>>> dateparser.parse("1h 20m", settings={"RELATIVE_BASE": ref_date})
datetime.datetime(2023, 1, 2, 1, 44, 5)
>>> dateparser.parse("1h20m", settings={"RELATIVE_BASE": ref_date,
                                        "PREFER_DATES_FROM": "future"})
datetime.datetime(2023, 1, 2, 4, 24, 5)
Gallaecio commented 9 months ago

Thanks!