Metadata-Version: 2.4
Name: dateparser
Version: 1.5.0
Summary: Date parsing library designed to parse dates from HTML pages
Author-email: Scrapinghub <opensource@zyte.com>
License-Expression: BSD-3-Clause
Project-URL: Source, https://github.com/scrapinghub/dateparser
Project-URL: History, https://dateparser.readthedocs.io/en/latest/history.html
Keywords: dateparser
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: Natural Language :: English
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Classifier: Programming Language :: Python :: Implementation :: CPython
Requires-Python: >=3.10
Description-Content-Type: text/x-rst
License-File: LICENSE
License-File: AUTHORS.rst
Requires-Dist: python-dateutil>=2.7.0
Requires-Dist: pytz>=2024.2
Requires-Dist: regex>=2024.9.11
Requires-Dist: tzlocal>=0.2
Provides-Extra: calendars
Requires-Dist: convertdate>=2.2.1; extra == "calendars"
Requires-Dist: hijridate; extra == "calendars"
Provides-Extra: langdetect
Requires-Dist: langdetect>=1.0.0; extra == "langdetect"
Dynamic: description
Dynamic: description-content-type
Dynamic: license-file

.. Note that we use raw HTML in the header section because centering images and paragraphs is not supported in Github (https://github.com/github/markup/issues/163)

.. image:: artwork/dateparser-logo.png
   :alt: Dateparser
   :width: 500
   :target: https://github.com/scrapinghub/dateparser


**Python parser for human readable dates**


.. docs-include-marker


Key Features
============

-  Support for almost every existing date format: absolute dates,
   relative dates (``"two weeks ago"`` or ``"tomorrow"``), timestamps,
   etc.
-  Support for more than `200 language
   locales <https://dateparser.readthedocs.io/en/latest/supported_locales.html>`__.
-  Language autodetection
-  Customizable behavior through
   `settings <https://dateparser.readthedocs.io/en/latest/settings.html>`__.
-  Support for `non-Gregorian calendar
   systems <#supported-calendars>`__.
-  Support for dates with timezones abbreviations or UTC offsets
   (``"August 14, 2015 EST"``, ``"21 July 2013 10:15 pm +0500"``...)
-  `Search dates <#search-for-dates-in-longer-chunks-of-text>`__
   in longer texts.
-  Time span detection for expressions like "past month", "last week".

Online demo
===========

Do you want to try it out without installing any dependency? Now you can test
it quickly by visiting `this online demo <https://gnyman.github.io/dateparser-demo-app/>`__!



How To Use
==========

The most straightforward way to parse dates with **dateparser** is to
use the ``dateparser.parse()`` function, that wraps around most of the
functionality of the module.

.. code:: python

    >>> import dateparser

    >>> dateparser.parse('Fri, 12 Dec 2014 10:55:50')
    datetime.datetime(2014, 12, 12, 10, 55, 50)

    >>> dateparser.parse('1991-05-17')
    datetime.datetime(1991, 5, 17, 0, 0)

    >>> dateparser.parse('In two months')  # today is 1st Aug 2020
    datetime.datetime(2020, 10, 1, 11, 12, 27, 764201)

    >>> dateparser.parse('1484823450')  # timestamp
    datetime.datetime(2017, 1, 19, 10, 57, 30)

    >>> dateparser.parse('January 12, 2012 10:00 PM EST')
    datetime.datetime(2012, 1, 12, 22, 0, tzinfo=<StaticTzInfo 'EST'>)

**dateparser** also works with strings in different languages:

.. code:: python

    >>> dateparser.parse('Martes 21 de Octubre de 2014')  # Spanish (Tuesday 21 October 2014)
    datetime.datetime(2014, 10, 21, 0, 0)

    >>> dateparser.parse('Le 11 Décembre 2014 à 09:00')  # French (11 December 2014 at 09:00)
    datetime.datetime(2014, 12, 11, 9, 0)

    >>> dateparser.parse('13 января 2015 г. в 13:34')  # Russian (13 January 2015 at 13:34)
    datetime.datetime(2015, 1, 13, 13, 34)

    >>> dateparser.parse('1 เดือนตุลาคม 2005, 1:00 AM')  # Thai (1 October 2005, 1:00 AM)
    datetime.datetime(2005, 10, 1, 1, 0)

    >>> dateparser.parse('yaklaşık 23 saat önce')  # Turkish (23 hours ago), current time: 12:46
    datetime.datetime(2019, 9, 7, 13, 46)

    >>> dateparser.parse('2小时前')  # Chinese (2 hours ago), current time: 22:30
    datetime.datetime(2018, 5, 31, 20, 30)

You can specify the language(s), if known, using the ``languages`` argument.
In this case, given languages are used and language detection is skipped:

.. code:: python

    >>> dateparser.parse('2015, Ago 15, 1:08 pm', languages=['pt', 'es'])
    datetime.datetime(2015, 8, 15, 13, 8)

If you know the possible formats of the dates, you can use the
``date_formats`` argument:

.. code:: python

    >>> dateparser.parse('22 Décembre 2010', date_formats=['%d %B %Y'])
    datetime.datetime(2010, 12, 22, 0, 0)

The formats are tried first. A date string that none of them parses is then
parsed as if no formats were given, so a number that is out of range for a
format can be read as another part of the date (``32`` is not a day, but it is
a valid two-digit year). To accept only the given formats, set ``PARSERS`` to
``['custom-formats']``, which also turns off timestamps, relative dates and
free-form dates:

.. code:: python

    >>> dateparser.parse('32 DEC 10', date_formats=['%d %b %y'])
    datetime.datetime(2032, 12, 10, 0, 0)

    >>> dateparser.parse('32 DEC 10', date_formats=['%d %b %y'], settings={'PARSERS': ['custom-formats']})
    None

Relative Dates
--------------

.. code:: python

    >>> from dateparser import parse
    >>> parse('1 hour ago')
    datetime.datetime(2015, 5, 31, 23, 0)
    >>> parse('Il ya 2 heures')  # French (2 hours ago)
    datetime.datetime(2015, 5, 31, 22, 0)
    >>> parse('1 anno 2 mesi')  # Italian (1 year 2 months)
    datetime.datetime(2014, 4, 1, 0, 0)
    >>> parse('yaklaşık 23 saat önce')  # Turkish (23 hours ago)
    datetime.datetime(2015, 5, 31, 1, 0)
    >>> parse('Hace una semana')  # Spanish (a week ago)
    datetime.datetime(2015, 5, 25, 0, 0)
    >>> parse('2小时前')  # Chinese (2 hours ago)
    datetime.datetime(2015, 5, 31, 22, 0)
    >>> parse('next Wednesday')
    datetime.datetime(2015, 6, 3, 0, 0)

In English, ``last``, ``this`` and ``next`` before a weekday mean its closest
occurrence before, on or after, and after the current date, respectively,
regardless of the ``PREFER_DATES_FROM`` setting. So ``this Wednesday`` and
``next Wednesday`` are the same date except on a Wednesday. They do not apply
to ``wed``, ``sat`` and ``sun``, which are also common English words.

.. note:: Testing above code might return different values depending on your environment's current date and time.

.. note:: For the ``Finnish`` language, please specify ``settings={'SKIP_TOKENS': []}`` to correctly parse relative dates.

Date Order
----------

.. code:: python

    >>> # parsing ambiguous date
    >>> parse('02-03-2016')  # assumes english language, uses MDY date order
    datetime.datetime(2016, 2, 3, 0, 0)
    >>> parse('le 02-03-2016')  # detects french, uses DMY date order
    datetime.datetime(2016, 3, 2, 0, 0)

.. note:: Ordering is not locale-based — do not expect ``DMY`` order for UK/Australia English.
   You can specify date order explicitly:

   .. code:: python

       >>> parse('18-12-15 06:00', settings={'DATE_ORDER': 'DMY'})
       datetime.datetime(2015, 12, 18, 6, 0)

For more on date order, see the `settings documentation <https://dateparser.readthedocs.io/en/latest/settings.html>`__.

Timezone and UTC Offset
-----------------------

By default, `dateparser` returns a timezone-aware ``datetime`` if a timezone is
present in the date string. Otherwise it returns a naive ``datetime`` object.

.. code:: python

    >>> parse('January 12, 2012 10:00 PM EST')
    datetime.datetime(2012, 1, 12, 22, 0, tzinfo=<StaticTzInfo 'EST'>)

    >>> parse('January 12, 2012 10:00 PM -0500')
    datetime.datetime(2012, 1, 12, 22, 0, tzinfo=<StaticTzInfo 'UTC\-05:00'>)

    >>> parse('2 hours ago EST')
    datetime.datetime(2017, 3, 10, 15, 55, 39, 579667, tzinfo=<StaticTzInfo 'EST'>)

If the date has no timezone name/abbreviation or offset, you can specify it
using the ``TIMEZONE`` setting:

.. code:: python

    >>> parse('January 12, 2012 10:00 PM', settings={'TIMEZONE': 'US/Eastern'})
    datetime.datetime(2012, 1, 12, 22, 0)

    >>> parse('January 12, 2012 10:00 PM', settings={'TIMEZONE': 'US/Eastern', 'RETURN_AS_TIMEZONE_AWARE': True})
    datetime.datetime(2012, 1, 12, 22, 0, tzinfo=<DstTzInfo 'US/Eastern' EST-1 day, 19:00:00 STD>)

    >>> parse('10:00 am', settings={'TIMEZONE': 'EST', 'TO_TIMEZONE': 'EDT'})
    datetime.datetime(2016, 9, 25, 11, 0)

    >>> parse('10:00 am EST', settings={'TO_TIMEZONE': 'EDT'})
    datetime.datetime(2017, 3, 12, 11, 0, tzinfo=<StaticTzInfo 'EDT'>)

For more on timezones, see the `settings documentation <https://dateparser.readthedocs.io/en/latest/settings.html>`__.

Incomplete Dates
----------------

.. code:: python

    >>> from dateparser import parse
    >>> parse('December 2015')  # default behavior
    datetime.datetime(2015, 12, 16, 0, 0)
    >>> parse('December 2015', settings={'PREFER_DAY_OF_MONTH': 'last'})
    datetime.datetime(2015, 12, 31, 0, 0)
    >>> parse('December 2015', settings={'PREFER_DAY_OF_MONTH': 'first'})
    datetime.datetime(2015, 12, 1, 0, 0)

    >>> parse('March')
    datetime.datetime(2015, 3, 16, 0, 0)
    >>> parse('March', settings={'PREFER_DATES_FROM': 'future'})
    datetime.datetime(2016, 3, 16, 0, 0)

    >>> import dateparser
    >>> dateparser.parse("2015")  # default behavior
    datetime.datetime(2015, 3, 27, 0, 0)
    >>> dateparser.parse("2015", settings={"PREFER_MONTH_OF_YEAR": "last"})
    datetime.datetime(2015, 12, 27, 0, 0)
    >>> dateparser.parse("2015", settings={"PREFER_MONTH_OF_YEAR": "current"})
    datetime.datetime(2015, 3, 27, 0, 0)

You can also ignore incomplete dates by setting the ``STRICT_PARSING`` flag:

.. code:: python

    >>> parse('December 2015', settings={'STRICT_PARSING': True})
    None

For more on handling incomplete dates, see the `settings documentation <https://dateparser.readthedocs.io/en/latest/settings.html>`__.

Search for Dates in Longer Chunks of Text
-----------------------------------------

.. warning:: Support for date searching is limited and needs improvement.
   Contributions are welcome — see `contributing <https://dateparser.readthedocs.io/en/latest/contributing.html>`__.

You can extract dates from longer strings of text. Results are returned as a
list of ``(substring, datetime)`` tuples:

.. code:: python

    >>> from dateparser.search import search_dates
    >>> search_dates('Today is 25 of October 2017, so the 27th is in 2 days.')
    [('25 of October 2017', datetime.datetime(2017, 10, 25, 0, 0)), ('the 27th is in 2 days', datetime.datetime(2017, 10, 27, 0, 0))]

Pass ``languages`` when you know them: language detection is slow and
error-prone on short text. If no date is found, ``None`` is returned:

.. code:: python

    >>> search_dates('Lancé le 4 octobre 1957.', languages=['fr'])
    [('le 4 octobre 1957', datetime.datetime(1957, 10, 4, 0, 0))]
    >>> search_dates('Rien à voir.', languages=['fr'])
    None

See the `API reference
<https://dateparser.readthedocs.io/en/latest/dateparser.html#dateparser.search.search_dates>`__
for other parameters, such as ``strategy``.

Time Span Detection
-------------------

The ``search_dates`` function can also detect time spans such as "past month"
or "last week". When ``RETURN_TIME_SPAN`` is enabled it returns start and end
dates for the detected period.

For example, assuming the current date and time is `December 7, 2024, 15:30`:

.. code:: python

    >>> search_dates("Messages from the past month", settings={'RETURN_TIME_SPAN': True})
    [('past month (start)', datetime.datetime(2024, 11, 7, 15, 30)),
     ('past month (end)', datetime.datetime(2024, 12, 7, 15, 30))]

Settings
--------

You can control multiple behaviors by using the ``settings`` parameter:

.. code:: python

    >>> dateparser.parse('2014-10-12', settings={'DATE_ORDER': 'YMD'})
    datetime.datetime(2014, 10, 12, 0, 0)

    >>> dateparser.parse('2014-10-12', settings={'DATE_ORDER': 'YDM'})
    datetime.datetime(2014, 12, 10, 0, 0)

    >>> dateparser.parse('1 year', settings={'PREFER_DATES_FROM': 'future'})  # Today is 2020-09-23
    datetime.datetime(2021, 9, 23, 0, 0)

    >>> dateparser.parse('tomorrow', settings={'RELATIVE_BASE': datetime.datetime(1992, 1, 1)})
    datetime.datetime(1992, 1, 2, 0, 0)

To see all available settings, check the `settings
documentation <https://dateparser.readthedocs.io/en/latest/settings.html>`__.

False positives
---------------

**dateparser** will do its best to return a date, dealing with multiple formats and different locales.
For that reason it is important that the input is a valid date, otherwise it could return false positives.

To reduce the possibility of receiving false positives, make sure that:

- The input string is a valid date and doesn't contain any other words or numbers.
- If you know the language or languages beforehand, you add them through the ``languages`` or ``locales`` properties.


On the other hand, if you want to exclude any of the default parsers
(``timestamp``, ``relative-time``...) or change the order in which they
are executed, you can do so through the
`settings PARSERS <https://dateparser.readthedocs.io/en/latest/usage.html#handling-incomplete-dates>`_.

Installation
============

Dateparser supports Python 3.10+. You can install it by doing:

::

    $ pip install dateparser

If you want to use a non-Gregorian calendar, you need to install the
``calendars`` extra:

::

    $ pip install dateparser[calendars]

Supported Calendars
===================

Apart from the Gregorian calendar, `dateparser` supports the `Persian Jalali
calendar`, the `Hijri/Islamic calendar`, the `French Republican calendar` and
the `Minguo calendar`. To use the first three, install the ``calendars`` extra
(see `Installation`_).

Example using the `Persian Jalali calendar
<https://en.wikipedia.org/wiki/Iranian_calendars#Zoroastrian_calendar>`_:

.. code:: python

    >>> from dateparser.calendars.jalali import JalaliCalendar
    >>> JalaliCalendar('جمعه سی ام اسفند ۱۳۸۷').get_date()
    DateData(date_obj=datetime.datetime(2009, 3, 20, 0, 0), period='day', locale=None, parts=('year', 'month', 'day'))

Example using the `Hijri/Islamic calendar
<https://en.wikipedia.org/wiki/Islamic_calendar>`_:

.. code:: python

    >>> from dateparser.calendars.hijri import HijriCalendar
    >>> HijriCalendar('17-01-1437 هـ 08:30 مساءً').get_date()
    DateData(date_obj=datetime.datetime(2015, 10, 30, 20, 30), period='day', locale=None, parts=('year', 'month', 'day', 'time'))

Example using the `French Republican calendar
<https://en.wikipedia.org/wiki/French_Republican_calendar>`_:

.. code:: python

    >>> from dateparser.calendars.french_republican import FrenchRepublicanCalendar
    >>> FrenchRepublicanCalendar('18 brumaire an VIII').get_date()
    DateData(date_obj=datetime.datetime(1799, 11, 9, 0, 0), period='day', locale=None)

Example using the `Minguo calendar
<https://en.wikipedia.org/wiki/Republic_of_China_calendar>`_:

.. code:: python

    >>> from dateparser.calendars.minguo import MinguoCalendar
    >>> MinguoCalendar('民國101年5月25日 08:36').get_date()
    DateData(date_obj=datetime.datetime(2012, 5, 25, 8, 36), period='day', locale=None)

Dependencies
============

`dateparser` relies on the following libraries:

* dateutil_'s module ``relativedelta`` for its freshness parser.
* convertdate_ to convert *Jalali* and *French Republican* dates to
  *Gregorian*.
* hijridate_ to convert *Hijri* dates to *Gregorian*.
* tzlocal_ to reliably get local timezone.
* ruamel.yaml_ (optional) for operations on language files.

.. _dateutil: https://pypi.python.org/pypi/python-dateutil
.. _convertdate: https://pypi.python.org/pypi/convertdate
.. _hijridate: https://pypi.python.org/pypi/hijridate
.. _tzlocal: https://pypi.python.org/pypi/tzlocal
.. _ruamel.yaml: https://pypi.python.org/pypi/ruamel.yaml

Common use cases
================

**dateparser** can be used for a wide variety of purposes,
but it stands out when it comes to:

Consuming data from different sources:
--------------------------------------

-  **Scraping**: extract dates from different places with several
   different formats and languages
-  **IoT**: consuming data coming from different sources with different
   date formats
-  **Tooling**: consuming dates from different logs / sources
-  **Format transformations**: when transforming dates coming from
   different files (PDF, CSV, etc.) to other formats (database, etc).

Offering natural interaction with users:
----------------------------------------

-  **Tooling and CLI**: allow users to write “3 days ago” to retrieve
   information.
-  **Search engine**: allow people to search by date in an easy /
   natural format.
-  **Bots**: allow users to interact with a bot easily

You may also like...
====================

-  `price-parser <https://github.com/scrapinghub/price-parser/>`__ - A
   small library for extracting price and currency from raw text
   strings.
-  `number-parser <https://github.com/scrapinghub/number-parser/>`__ -
   Library to convert numbers written in the natural language to it's
   equivalent numeric forms.
-  `Scrapy <https://github.com/scrapy/scrapy/>`__ - Web crawling and web
   scraping framework

License
=======

`BSD3-Clause <https://github.com/scrapinghub/dateparser/blob/master/LICENSE>`__


.. :changelog:

History
=======

1.5.0 (2026-11-04)
------------------

Breaking changes:

- ``DateData.period`` can take the new values ``"quarter"`` and
  ``"part_of_day"``, and with ``RETURN_TIME_AS_PERIOD`` enabled a relative
  date with hours, minutes or seconds, such as "2 hours ago", now has the
  ``"time"`` period instead of ``"day"`` (#1417, #1437, #1473)
- Stop caching and sharing ``Settings`` instances: creating one with the
  same settings twice now gives two different objects, and the
  ``Settings.registry_key`` attribute no longer exists (#1442)
- Remove the leftovers of fastText support from ``dateparser_cli``: the
  ``fasttext_manager`` and ``exceptions`` modules and
  ``utils.create_data_model_home()``; ``utils.dateparser_model_home`` and
  ``utils.DEFAULT_WINDOWS_CACHE_DIR`` are now ``pathlib.Path`` objects
  (#1406)
- Remove ``Locale.to_parserinfo()`` and ``HijriDate.weekday()``, which
  always raised an exception (#1406, #1457)

Deprecations:

- Deprecate ``dateparser.timezone_parser.convert_to_local_tz()`` (#1481)
  and ``dateparser.timezone_parser.build_tz_offsets()`` (#1405)
- Emit a ``FutureWarning`` naming the ``TZ`` value from ``parse()``,
  ``DateDataParser`` and ``search_dates()`` when the local timezone cannot
  be determined; a future version will raise ``RuntimeError`` instead of
  failing to parse the date (#1403, #1556)
- Deprecate ``dateparser.utils.registry()`` and ``Settings.get_key()``,
  which now emit a ``FutureWarning`` (#1442, #1556)
- Deprecate ``get_week_start()`` and ``get_week_end()`` in
  ``dateparser.utils.time_spans``, and calling ``generate_time_span()``
  without ``base_date`` or ``settings``; all of them now emit a
  ``FutureWarning`` (#1393, #1556)
- Deprecate ``dateparser.date.RE_TRIM_COLONS`` (`GHSA-fmxc-97cw-ph6p
  <https://github.com/scrapinghub/dateparser/security/advisories/GHSA-fmxc-97cw-ph6p>`_)

Security fixes:

- Make sentence splitting in ``search_dates()`` linear on long punctuation
  runs, to prevent quadratic backtracking (ReDoS) for Arabic, Bengali,
  Cantonese, Chinese, Hindi, Japanese and Persian (`GHSA-rx9v-94ff-9cc2
  <https://github.com/scrapinghub/dateparser/security/advisories/GHSA-rx9v-94ff-9cc2>`_)
- Prevent quadratic regex matching (ReDoS) on long digit runs in Cantonese,
  Chinese and Japanese, and a ``ValueError`` on runs of more than 4,300
  digits on Python 3.10.7 and later (`GHSA-g8fh-jxm9-6qfx
  <https://github.com/scrapinghub/dateparser/security/advisories/GHSA-g8fh-jxm9-6qfx>`_)
- Bound the lookahead of the Chinese month simplification, to prevent quadratic
  parsing time on long runs of numbers followed by 月 (`GHSA-q7fp-xwcm-6x9f
  <https://github.com/scrapinghub/dateparser/security/advisories/GHSA-q7fp-xwcm-6x9f>`_)
- Prevent quadratic regex matching (ReDoS) on long runs of digits or whitespace
  (`GHSA-gqj4-wf6c-wmcg
  <https://github.com/scrapinghub/dateparser/security/advisories/GHSA-gqj4-wf6c-wmcg>`_)
- Strip trailing colons in linear time, to prevent quadratic backtracking
  (ReDoS) on long colon runs (`GHSA-fmxc-97cw-ph6p
  <https://github.com/scrapinghub/dateparser/security/advisories/GHSA-fmxc-97cw-ph6p>`_)
- Split strings into known words in linear time, to prevent quadratic parsing
  time on long runs of words like month names (`GHSA-jxmm-w6rw-32ch
  <https://github.com/scrapinghub/dateparser/security/advisories/GHSA-jxmm-w6rw-32ch>`_)

New features:

- Add a ``STRICT_DATE_ORDER`` setting that turns an explicit ``DATE_ORDER``
  from a preference into a requirement: ``"year"`` reads a two-digit year
  only from the position ``DATE_ORDER`` gives it, and ``"all"`` also keeps
  the day and month where the order puts them (#1443)
- Add a ``TIMEZONE_ABBREVIATIONS`` setting to override the offset of
  timezone abbreviations, e.g. to read ``IST`` as India Standard Time
  instead of Israel Standard Time (#1415)
- Parse parts of the day, such as "tomorrow morning", "this evening" or
  "8 in the evening", at the times set by the new ``PARTS_OF_DAY`` setting;
  the new ``DateData.part_of_day`` attribute tells which one was found
  (#1473, #1562)
- Add ``DateData.parts``, which lists the date parts (day, month, year,
  time…) read from the input rather than filled in from defaults (#1408)
- Add an ``add_period`` argument to ``search_dates()`` to also return the
  period of each date (#1437)
- Add a ``date_formats`` argument to ``search_dates()``, to find dates
  written in the given formats; it requires ``strategy="ngram"`` and raises
  ``ValueError`` with the default ``"split"`` strategy (#1436)
- Add the French Republican calendar and the Minguo (Taiwanese) calendar
  (#1483, #1489)
- Parse calendar quarters, such as "2025Q1", "2025-Q3" or "Q4 2025", as a
  month of that quarter picked by ``PREFER_MONTH_OF_YEAR`` (by default, the
  month as far into the quarter as the current month is into its own)
  (#1417)
- Parse "last", "this" and "next" before a weekday in English, e.g. "next
  Friday", as the closest occurrence of that weekday before, on or after,
  and after the current date, whatever ``PREFER_DATES_FROM`` is, except for
  the abbreviations "wed", "sat" and "sun"; ``search_dates()`` now includes
  the word in its matches (#1401)
- Parse "the Nth of last/this/next month" as a day of that month (#1414)
- Parse Roman numeral years written in capitals, e.g. "5 March MDCCLXXVI";
  a short one such as "MMX" is read as a year only next to a month name,
  e.g. "April MMX" (#1482)
- Parse dates with a bare UTC offset, such as "+03" (#1475)
- Parse AM/PM written before the time, e.g. "PM 2:26" or
  "下午 02:26:26" (#1469)
- Parse ISO 8601 fractional seconds written with a decimal comma, e.g.
  "12:30:45,123" (#1467)
- Parse English number words from thirteen to ninety-nine, e.g.
  "forty-five seconds ago" (#1416)
- Parse "fortnight" and "century" in English relative dates, and read
  "a decade from now" as the future instead of the past (#1539)
- Match month and weekday names in ``date_formats`` in the given languages,
  so formats with literal text work, e.g. "el %d de %B de %Y" for "el 15 de
  junio de 2020" with ``languages=["es"]`` (#1486, #1552)
- When a date does not parse, try the other meanings of ambiguous words,
  such as Spanish "mar" (martes or marzo) (#1491), and read a token that
  is both a weekday and a month abbreviation as the weekday when that is
  what fits (#1476)
- In ``search_dates()``, find dates written:

  - right after a label and a colon in Chinese or Japanese, e.g.
    "日期：2020年12月28日" (#1407)
  - next to a relative date without a comma (#1385)
  - joined by words that search skips, like "and" (#1488)
  - inside parentheses, square brackets or straight quotes, e.g.
    ``'He said "May 5, 2020"'`` or "(Friday)" (#1401, #1565)

Fixes:

- Take the current date, used to fill in the missing parts of a date such
  as "12:30" or "Nov" and to apply ``PREFER_DATES_FROM``, from the
  ``TIMEZONE`` setting (the local time zone by default) instead of UTC
  (#1427)
- Keep the ``%z`` offset when parsing with ``date_formats``, and return a
  timezone-aware date for it unless ``RETURN_AS_TIMEZONE_AWARE`` is
  ``False`` (#1424)
- Read year-first dates, such as "2021-01-13", as YMD unless ``DATE_ORDER``
  starts with the year (#1419)
- Swap the day and the month when they do not fit an explicit
  ``DATE_ORDER``, whatever its value, e.g. "01/13/2021" with ``DMY`` (#1431)
- Read a lone number next to a four-digit year as the month under any
  ``DATE_ORDER`` (#1472)
- Apply ``PREFER_DAY_OF_MONTH`` before ``PREFER_DATES_FROM`` picks the year
  (#1409), and apply ``PREFER_DAY_OF_MONTH`` and ``PREFER_MONTH_OF_YEAR``
  to relative dates such as "last year" (#1413)
- Apply an explicit ``DATE_ORDER`` to every date that ``search_dates()``
  finds, not only to the first one (#1535)
- Stop dropping extra numbers when parsing dates: a string with more numbers
  than a date has, such as "5 10 Jan 2020" or "03/04/2021 5", now returns
  ``None`` instead of a date built from some of them (#1480)
- Stop reading two adjacent numbers of a Russian numeric date as one
  compound ordinal, so ``parse("20 03 2021", languages=["ru"])`` returns
  20 March 2021 instead of the 23rd of the current month (#1554)
- Return ``None`` for strings with only skipped words, such as "year" or
  "hour minute", instead of today, which also stops ``search_dates()`` from
  returning them (#1440, #1564)
- Stop ignoring numbers without a unit in relative dates, so "03/06/2020
  hour", "03/06/2020 day" or "01.02.2011 godz. 08:39" no longer parse as a
  number of hours or days ago (#1410)
- Stop reading "Nth day" as a number of days, e.g. "the 1st day of March
  2015" (#1412)
- Parse "at 22h" and "à 22h" as a time of day, not as hours ago; a bare
  "à 22h" is still read as English hours ago unless ``languages=["fr"]`` is
  given or the text has other French words, such as "demain à 22h" (#1441)
- Keep the future direction of a relative expression that ``search_dates()``
  finds next to punctuation, e.g. "in 2 hours, thanks" (#1391)
- Stop French "sept" being read as 7 when it means September, e.g.
  "1 sept 2024" with ``languages=["fr"]`` and "le 3 sept à 10h" with or
  without ``languages``; "sept" now means 7 only before a duration unit
  or a clock time ("sept jours", "sept heures", "sept:30"), so a day
  written as a word, as in "sept mai 2020", no longer parses, and a bare
  "sept" is read as September (#1353)
- Parse dates with a numeric offset followed by a redundant timezone
  abbreviation, e.g. "-0500 (CDT)", or with an abbreviation glued to the
  time, e.g. "2019-09-28WIB19:17:34" (#1348)
- Recognize UTC offsets written with Unicode dash-like characters, such as
  "−05:00" (#1474)
- Keep complete week dates (year, week number and weekday) when parsing
  with ``date_formats``, including ``%G`` ISO week years (#1381)
- Fix negative timestamps with subseconds (#1387)
- Keep AM when searching for dates after a time (#1400)
- Keep full stops between digits in ``search_dates()`` sentences (#1471)
- Fix ``search_dates()`` dropping text next to a standalone accent mark
  (#1505)
- Fix ``search_dates()`` raising ``IndexError`` for the ``zh-Hans``,
  ``zh-Hant`` and ``yue`` locales, including when it detects one of them in
  the text, e.g. "聽日" (#1401, #1407)
- In ``search_dates()``, include the closing bracket in the matched text,
  e.g. "8 May 2020 (16:05)", and stop including separators such as "/" or
  "|" (#1401)
- Split a relative date from a numeric date that follows it in
  ``search_dates()``, e.g. "3 days later on 2010-05-10" (#1430)
- Stop growing internal caches with every distinct ``RELATIVE_BASE`` value
  (#1442)
- Fix ``parse()`` and ``DateDataParser`` returning ``None`` when ``region``
  does not match the language of the text, e.g.
  ``parse("12 mars 2020", languages=["fr"], region="MX")`` or
  ``parse("5 de marzo de 2020", region="US")`` (#1423)
- Fix ``dateparser.utils.get_logger()`` raising ``AttributeError`` when
  ``logging.config`` had not been imported (#1457)

Improvements:

- Speed up ``parse()`` by about 35% (#1544), skip locales that cannot
  change the outcome of a failed parse (#1390), and speed up import by
  compiling the timezone regexes lazily (#1405)
- Arabic: parse relative dates that use قبل for "ago" (#1397), Egyptian and
  informal ة→ه spellings (#1493), numbered Levantine month names such as
  "كانون 2" in the ``ar-SY``, ``ar-JO``, ``ar-LB``, ``ar-PS`` and ``ar-IQ``
  locales only, e.g. ``locales=["ar-SY"]`` or ``region="SY"`` (#1511),
  Arabic dates typed with Persian yeh and kaf and Persian dates typed with
  Arabic ones (#1423), and Arabic month names and Arabic-Indic digits in
  Hijri dates (#1432)
- Chinese: add the supplementary data of ``zh`` to ``zh-Hans`` and
  ``zh-Hant`` (#1407), and parse 后天, 大后天 and 大前天 as relative days
  (#1430)
- Chinese and Japanese: parse dates with spaces around 年, 月 and 日 (#1477,
  #1566)
- French: parse "midi" as noon, e.g. "demain à midi" ("après-midi" and
  "avant midi" are still not read as noon); this also applies when no
  ``languages`` are given, so ``search_dates()`` can return "MIDI" in an
  English text as 12:00 (#1536)
- Indonesian: add old-style month abbreviations, such as "Djan" or "Peb"
  (#1501)
- Korean: parse absolute dates written with 년, 월, 일, 시 and 분 (#1434)
- Slovak: parse "pozajtra" (#1430)
- Swedish: parse ordinal day suffixes like "24:e" and "1:a" (#1484)
- Thai: parse relative dates with spaced ago/in words (#1411)
- Vietnamese: parse dates with zero-padded months (#1338, #1563)
- Add type hints (#1457)
- Document ``search_dates()`` in the API reference (#1468), add a
  performance section (#1494), explain how ``DEFAULT_LANGUAGES`` relates to
  the ``languages`` argument (#1422) and how ``date_formats`` falls back to
  the other parsers (#1549)
- Show the whole README on PyPI (#1359)

1.4.3 (2026-09-03)
------------------

Fixes:

- Make parsing thread-safe: parsing from several threads no longer
  raises an intermittent ``KeyError`` from the shared language caches,
  and a ``DATE_ORDER`` or ``RELATIVE_BASE`` value meant for one parse no
  longer leaks into the settings that other parses read, where it could
  make them return a wrong date (#1346)
- Do not share the language detector and the detected locale between
  ``search_dates()`` calls, so concurrent searches over text in
  different languages no longer return ``None`` or a date read in the
  wrong locale (#1371)
- Resolve the ``BST`` and ``HDT`` timezone abbreviations to the offsets
  the tz database gives them, UTC+1 (British Summer Time) and UTC-9
  (Hawaii-Aleutian Daylight Time), instead of +11 and -9:30, which no
  zone goes by those names today; abbreviations that the tz database
  maps to more than one offset, such as ``CST`` and ``IST``, keep their
  current offset. Text carrying these abbreviations keeps its wall clock
  but moves by 10 hours for ``BST`` and 30 minutes for ``HDT``, which can
  put the parsed instant on a different day (#1366)
- Reject a ``%j`` (day of year) value that the parsed year does not
  have, instead of rolling it over into the next year, so "1999366" with
  ``date_formats=["%Y%j"]`` returns ``None`` rather than 2000-01-01. A
  format with no year directive is checked against the year ``strptime``
  defaults to, 1900, which is not a leap year, so "366" with
  ``date_formats=["%j"]`` now returns ``None`` where it used to return
  January 1 (#1370)

Cleanups and internal improvements:

- Add CodSpeed benchmarks and a workflow that runs them, so a
  performance regression such as the quadratic backtracking fixed in
  1.4.1 is reported on the pull request that introduces it (#1365)

1.4.2 (2026-08-04)
------------------

New features:

- Add an ``IGNORE_SURROUNDING_TEXT`` setting that, when enabled, retries
  parsing after ignoring the leading and trailing words the language does
  not recognize, so a date wrapped in extra text such as "Published on
  16/04/2019" is parsed (#1356)
- Add a ``strategy`` argument to ``search_dates()`` to choose the search
  strategy: the default ``"split"`` keeps the current behavior, while the
  new ``"ngram"`` strategy parses the longest sequences of tokens as dates
  for more predictable results on noisy text (#1351)

Fixes:

- Do not read a two-digit number as a year once a later component has been
  found in year-first date orders, so the day in Japanese dates such as
  "4月20日" is no longer consumed as the year (#1358)
- Parse ISO 8601 dates (those starting with a four-digit year) in month-day
  order even when an explicit day-first language such as ``it`` or ``fr`` is
  given, without needing to set ``PREFER_LOCALE_DATE_ORDER`` to ``False``
  (#1352)
- Honor ``PREFER_DATES_FROM`` and ``RELATIVE_BASE`` when parsing with custom
  ``date_formats`` that use a two-digit year (``%y``) (#1342)
- Honor the ``%j`` (day of year) directive in ``date_formats`` instead of
  overwriting the parsed month and day with the current date (#1345)

Improvements:

- Update the bundled CLDR locale data to 44.1.0, adding many newly
  recognized date forms across locales and a standalone hour/duration unit
  (e.g. Catalan "2 hores"), while keeping previously supported forms
  parseable (#1343)
- Add the Italian expressions "un ora fa" and "un'ora fa", and skip "alle"
  so phrases like "oggi alle 11:00" parse (#1049)
- Expand Czech date translations with month locative/dative forms (e.g. "v
  lednu 2023"), the July abbreviation "črv", and relative expressions such
  as "za týden", "za měsíc" and "za rok" (#1172)
- Specify the README header content as RST rather than raw HTML (#1360)

1.4.1 (2026-06-15)
------------------

Breaking changes:

- Remove fastText language detection support: the ``fasttext`` extra is
  dropped and ``detect_languages()`` now raises ``ImportError``. Migrate to
  the ``langdetect`` extra, which also unblocks ``numpy`` 2.x compatibility
  (#1315)

Security fixes:

- Make digit quantifiers possessive in the relative-date regexes to prevent
  quadratic backtracking (ReDoS) on long digit runs (#1335)

New features:

- Add the ``USE_GIVEN_LANGUAGE_ORDER`` setting to try ``languages`` and
  ``locales`` in the order given rather than by frequency (#789)

Fixes:

- Preserve explicit signs on individual components when parsing relative
  dates that combine decades with years, such as "-1 decade +2 years" (#1330)
- Fall back to other provided languages in ``search_dates`` when the
  detected language yields no dates (#1331)
- Parse relative date expressions with spaces between the sign and number,
  such as "now - 2 hours" and "now + 1 day" (#1327)
- Use the parser-relative ``now`` for the current month when filling in
  incomplete dates so the month and day stay consistent (#1332)
- Fix Norwegian Bokmål (``nb``) parsing of relative date expressions such
  as "3 måneder siden" and "om 2 måneder" (#1334)
- Parse abbreviated English month expressions such as "1mon ago" and
  "3mons ago" (#1329)
- Preserve surrounding whitespace when removing skip tokens during
  translation to avoid spurious double spaces (#1324)

Improvements:

- Move project metadata and build configuration to ``pyproject.toml`` (#1311)
- Add alternative Korean date expressions for today, yesterday, tomorrow,
  and "N months ago/later" (#1289)
- Expand Czech date translations with additional inflections, word numbers,
  decade and century expressions, and clock phrases like "čtvrt na tři"
  (#1325)
- Replace internal ``OrderedDict`` usage with the built-in ``dict`` (#1328)

1.4.0 (2026-03-26)
------------------

Security fixes:

- Remove import-time loading of timezone offset data from pickle to prevent
  unsafe deserialization from packaged data
- Replace ``eval()`` use when parsing ``no_word_spacing`` with strict boolean
  parsing to prevent code execution from locale metadata (#1056)

New features:

- Add support for expressions like "N {interval} from now" in English (#1271)
- Add support for the ``en-US`` locale (#1222)

Fixes:

- Honor ``REQUIRE_PARTS`` for ambiguous month-number inputs by retrying with a
  year-biased ``DATE_ORDER`` (#1298)
- Fix parsing word-number relative phrases such as "two days later" (#1316)
- Allow md5hash to work in FIPS environments (#1267)

Improvements:

- Add Bosnian Cyrillic (ijekavica) date translations (#1293)
- Add a new browser-based demo to the project documentation (#1306)
- Update installation documentation to replace ``setup.py install`` guidance
  (#1310)
- Add a project security policy (#1318)

1.3.0 (2026-02-04)
------------------

Dropped Python 3.9 support. (#1296)

New features:

- ``search_dates()`` can now detect time spans from expressions like “past
  month”, “last week”, etc. For details, see the “Time Span Detection” section
  and the ``RETURN_TIME_SPAN``, ``DEFAULT_START_OF_WEEK`` and
  ``DEFAULT_DAYS_IN_MONTH`` settings in the documentation. (#1284)

Fixes:

- Assume the current year if not specified (#1288)
- Support expressions like “yesterday +1h” (#1303)
- English: Support most 2-letter day-of-the-week names (#1214)
- English: Support “in N weeks' time” (#1283)
- Finnish: Support dates with “klo” (#1301)
- Russian: Support compound ordinals (#1280)

Cleanups and internal improvements:

- Fixed year expectation issues in tests. (#1294)

1.2.2 (2025-06-26)
------------------

Fixes:

- Handle the Russian preposition “с” (#1261)
- Fix weekday search (#1274)

Improvements:

- Add Python 3.14 support (#1273)
- Cache timezone offsets to improve import time (#1250)

1.2.1 (2025-02-05)
------------------

Fixes:

- Fix PytzUsageWarning (#1109)
- Fix date_parser with prefer_month_of_year wrong results (#1224)
- Fix skipped day when UTC and tz are different days (#1183)

Improvements:

- Avoid repeated loop over timezones (#1238)
- Proofread README.rst (#1234)
- Check for derived types for configuration (#1223)
- Parse some abbreviated strings as relative dates (#1219)
- Migrate from hijri-converter to hijridate (#1211)
- Fixed ClusterFuzz build error by adding dateparser.data as a binary (#1208)
- Fix an issue detected by OSSFuzz (#1203)
- Support two-digit years in non-Gregorian calendars (#1187)
- Refactored CI to run extras separately and test minimum versions of dependencies, replaced flake8 with ruff, fixed tests (#1248)
- Set minimum versions for dependencies (#1248)
- Limited ``numpy`` to 1.x when installing ``dateparser[fasttext]`` (#1248)


1.2.0 (2023-11-17)
------------------

New features:

- New ``PREFER_MONTH_OF_YEAR`` setting (#1146)

Fixes:

- Absolute years in Russian are no longer being treated as a number of years in
  the past (#1129)

Cleanups and internal improvements:

- Removed the use of ``datetime.utcnow``, deprecated on Python 3.12 (#1179)
- Applied Black formatting to the code base (#1158)
- Initial integration with OSSFuzz (#1198)
- Extended test cases (#1191)


1.1.8 (2023-03-22)
------------------

Improvements:

- Improved date parsing for Chinese (#1148)
- Improved date parsing for Czech (#1151)
- Reorder language by popularity (#1152)
- Fix leak of memory in cache (#1140)
- Add support for "\d units later" (#1154)
- Move modification in CLDR data to yaml (#1153)
- Add support to use timezone via settings to get PREFER_DATES_FROM result (#1155)


1.1.7 (2023-02-02)
------------------

Improvements:

- Add an “ago” synonym for Arabic (#1128)
- Improved date parsing for Czech (#1131)
- Improved date parsing for Indonesian (#1134)


1.1.6 (2023-01-12)
------------------

Improvements:

- Fix the bug where Monday is parsed as a month (#1121)
- Prevent ReDoS in Spanish sentence splitting regex (#1084)


1.1.5 (2022-12-29)
------------------

Improvements:

- Parse short versions of day, month, and year (#1103)
- Add a test for “in 1d” (#1104)
- Update languages_info (#1107)
- Add a workaround for zipimporter not having exec_module before Python 3.10 (#1069)
- Stabilize tests at midnight (#1111)
- Add a test case for French (#1110)

Cleanups:

- Remove the requirements-build file (#1113)


1.1.4 (2022-11-21)
------------------

Improvements:

- Improved support for languages such as Slovak, Indonesian, Hindi, German and Japanese (#1064, #1094, #986, #1071, #1068)
- Recursively create a model home (#996)
- Replace regex sub with simple string replace (#1095)
- Add Python 3.10, 3.11 support (#1096)
- Drop support for Python 3.5, 3.6 versions (#1097)


1.1.3 (2022-11-03)
------------------

New features:

- Add support for fractional units (#876)

Improvements:

- Fix the returned datetime skipping a day with time+timezone input and PREFER_DATES_FROM = 'future' (#1002)
- Fix input translatation breaking keep_formatting (#720)
- English: support "till date" (#1005)
- English: support “after” and “before” in relative dates (#1008)

Cleanups:

- Reorganize internal data (#1090)
- CI updates (#1088)


1.1.2 (2022-10-20)
------------------

Improvements:

- Added support for negative timestamp (#1060)
- Fixed PytzUsageWarning for Python versions >= 3.6 (#1062)
- Added support for dates with dots and spaces (#1028)
- Improved support for Ukrainian, Croatian and Russian (#1072, #1074, #1079, #1082, #1073, #1083)
- Added support for parsing Unix timestamps consistently regardless of timezones (#954)
- Improved tests (#1086)


1.1.1 (2022-03-17)
------------------

Improvements:

- Fixed issue with regex library by pinning dependencies to an earlier version (< 2022.3.15, #1046).
- Extended support for Russian language dates starting with lowercase (#999).
- Allowed to use_given_order for languages too (#997).
- Fixed link to settings section (#1018).
- Defined UTF-8 encoding for Windows (#998).
- Fixed directories creation error in CLI utils (#1022).


1.1.0 (2021-10-04)
------------------

New features:

* Support language detection based on ``langdetect``, ``fastText``, or a
  custom implementation (see #932)
* Add support for 'by <time>' (see #839)
* Sort default language list by internet usage (see #805)

Improvements:

* Improved support of Chinese (#910), Czech (#977)
* Improvements in ``search_dates`` (see #953)
* Make order of previous locales deterministic (see #851)
* Fix parsing with trailing space (see #841)
* Consider ``RETURN_TIME_AS_PERIOD`` for timestamp times (see #922)
* Exclude failing regex version (see #974)
* Ongoing work multithreading support (see #881, #885)
* Add demo URL (see #883)

QA:

* Migrate pipelines from Travis CI to Github Actions (see #859, #879, #884,
  #886, #911, #966)
* Use versioned CLDR data (see #825)
* Add a script to update table of supported languages and locales (see #601)
* Sort 'skip' keys in yaml files (see #844)
* Improve test coverage (see #827)
* Code cleanup (see #888, #907, #951, #958, #957)


1.0.0 (2020-10-29)
------------------

Breaking changes:

* Drop support for Python 2.7 and pypy (see #727, #744, #748, #749, #754, #755, #758, #761, #763, #764, #777 and #783)
* Now ``DateDataParser.get_date_data()`` returns a ``DateData`` object instead of a ``dict`` (see #778).
* From now wrong ``settings`` are not silenced and raise ``SettingValidationError`` (see #797)
* Now ``dateparser.parse()`` is deterministic and doesn't try previous locales. Also, ``DateDataParser.get_date_data()`` doesn't try the previous locales by default (see #781)
* Remove the ``'base-formats'`` parser (see #721)
* Extract the ``'no-spaces-time'`` parser from the ``'absolute-time'`` parser and make it an optional parser (see #786)
* Remove ``numeral_translation_data`` (see #782)
* Remove the undocumented ``SKIP_TOKENS_PARSER`` and ``FUZZY`` settings (see #728, #794)
* Remove support for using strings in ``date_formats`` (see #726)
* The undocumented ``ExactLanguageSearch`` class has been moved to the private scope and some internal methods have changed (see #778)
* Changes in ``dateparser.utils``: ``normalize_unicode()`` doesn't accept ``bytes`` as input and ``convert_to_unicode`` has been deprecated (see #749)

New features:

* Add Python 3.9 support (see #732, #823)
* Detect hours separated with a period/dot (see #741)
* Add support for "decade" (see #762)
* Add support for the hijri calendar in Python ≥ 3.6 (see #718)

Improvements:

* New logo! (see #719)
* Improve the README and docs (see #779, #722)
* Fix the "calendars" extra (see #740)
* Fix leap years when ``PREFER_DATES_FROM`` is set (see #738)
* Fix ``STRICT_PARSING`` setting in ``no-spaces-time`` parser (see #715)
* Consider ``RETURN_AS_TIME_PERIOD`` setting for ``relative-time`` parser (see #807)
* Parse the 24hr time format with meridian info (see #634)
* Other small improvements (see #698, #709, #710, #712, #730, #731, #735, #739, #784, #788, #795 and #801)


0.7.6 (2020-06-12)
------------------

Improvements:

* Rename ``scripts`` to ``dateparser_scripts`` to avoid name collisions with modules from other packages or projects (see #707)


0.7.5 (2020-06-10)
------------------

New features:

* Add Python 3.8 support (see #664)
* Implement a ``REQUIRE_PARTS`` setting (see #703)
* Add support for subscript and superscript numbers (see #684)
* Extended French support (see #672)
* Extended German support (see #673)


Improvements:

* Migrate test suite to Pytest (see #662)
* Add test to check the `yaml` and `json` files content (see #663 and #692)
* Add flake8 pipeline with pytest-flake8 (see #665)
* Add partial support for 8-digit dates without separators (see #639)
* Fix possible ``OverflowError`` errors and explicitly avoid to raise ``ValueError`` when parsing relative dates (see #686)
* Fix double-digit GMT and UTC parsing (see #632)
* Fix bug when using ``DATE_ORDER`` (see #628)
* Fix bug when parsing relative time with timezone (see #503)
* Fix milliseconds parsing (see #572 and #661)
* Fix wrong values to be interpreted as ``'future'`` in ``PREFER_DATES_FROM`` (see #629)
* Other small improvements (see #667, #675, #511, #626, #512, #509, #696, #702 and #699)


0.7.4 (2020-03-06)
------------------
New features:

* Extended Norwegian support (see #598)
* Implement a ``PARSERS`` setting (see #603)

Improvements:

* Add support for ``PREFER_DATES_FROM`` in relative/freshness parser (see #414)
* Add support for ``PREFER_DAY_OF_MONTH`` in base-formats parser (see #611)
* Added UTC -00:00 as a valid offset (see #574)
* Fix support for “one” (see #593)
* Fix TypeError when parsing some invalid dates (see #536)
* Fix tokenizer for non recognized characters (see #622)
* Prevent installing regex 2019.02.19 (see #600)
* Resolve DeprecationWarning related to raw string escape sequences (see #596)
* Implement a tox environment to build the documentation (see #604)
* Improve tests stability (see #591, #605)
* Documentation improvements (see #510, #578, #619, #614, #620)
* Performance improvements (see #570, #569, #625)


0.7.3 (2020-03-06)
------------------
* Broken version


0.7.2 (2019-09-17)
------------------

Features:

* Extended Czech support
* Added ``time`` to valid periods
* Added timezone information to dates found with ``search_dates()``
* Support strings as date formats


Improvements:

* Fixed Collections ABCs depreciation warning
* Fixed dates with trailing colons not being parsed
* Fixed date format override on any settings change
* Fixed parsing current weekday as past date, regardless of settings
* Added UTC -2:30 as a valid offset
* Added Python 3.7 to supported versions, dropped support for Python 3.3 and 3.4
* Moved to importlib from imp where possible
* Improved support for Catalan
* Documentation improvements


0.7.1 (2019-02-12)
------------------

Features/news:

* Added detected language to return value of ``search_dates()``
* Performance improvements
* Refreshed versions of dependencies

Improvements:

* Fixed unpickleable ``DateTime`` objects with timezones
* Fixed regex pattern to avoid new behaviour of re.split in Python 3.7
* Fixed an exception thrown when parsing colons
* Fixed tests failing on days with number greater than 30
* Fixed ``ZeroDivisionError`` exceptions



0.7.0 (2018-02-08)
------------------

Features added during Google Summer of Code 2017:

* Harvesting language data from Unicode CLDR database (https://github.com/unicode-cldr/cldr-json), which includes over 200 locales (#321) - authored by Sarthak Maddan.
  See full currently supported locale list in README.
* Extracting dates from longer strings of text (#324) - authored by Elena Zakharova.
  Special thanks for their awesome contributions!


New features:

* Added (independently from CLDR) Georgian (#308) and Swedish (#305)

Improvements:

* Improved support of Chinese (#359), Thai (#345), French (#301, #304), Russian (#302)
* Removed ruamel.yaml from dependencies (#374). This should reduce the number of installation issues and improve performance as the result of moving away from YAML as basic data storage format.
  Note that YAML is still used as format for support language files.
* Improved performance through using pre-compiling frequent regexes and lazy loading of data (#293, #294, #295, #315)
* Extended tests (#316, #317, #318, #323)
* Updated nose_parameterized to its current package, parameterized (#381)


Planned for next release:

* Full language and locale names
* Performance and stability improvements
* Documentation improvements


0.6.0 (2017-03-13)
------------------

New features:

* Consistent parsing in terms of true python representation of date string. See #281
* Added support for Bangla, Bulgarian and Hindi languages.

Improvements:

* Major bug fixes related to parser and system's locale. See #277, #282
* Type check for timezone arguments in settings. see #267
* Pinned dependencies' versions in requirements. See #265
* Improved support for cn, es, dutch languages. See #274, #272, #285

Packaging:

* Make calendars extras to be used at the time of installation if need to use calendars feature.


0.5.1 (2016-12-18)
------------------

New features:

* Added support for Hebrew

Improvements:

* Safer loading of YAML. See #251
* Better timezone parsing for freshness dates. See #256
* Pinned dependencies' versions in requirements. See #265
* Improved support for zh, fi languages. See #249, #250, #248, #244


0.5.0 (2016-09-26)
------------------

New features:

* ``DateDataParser`` now also returns detected language in the result dictionary.
* Explicit and lucid timezone conversion for a given datestring using ``TIMEZONE``, ``TO_TIMEZONE`` settings.
* Added Hungarian language.
* Added setting, ``STRICT_PARSING`` to ignore incomplete dates.

Improvements:

* Fixed quite a few parser bugs reported in issues #219, #222, #207, #224.
* Improved support for chinese language.
* Consistent interface for both Jalali and Hijri parsers.


0.4.0 (2016-06-17)
------------------

New features:

* Support for Language based date order preference while parsing ambiguous dates.
* Support for parsing dates with no spaces in between components.
* Support for custom date order preference using ``settings``.
* Support for parsing generic relative dates in future.e.g. "tomorrow", "in two weeks", etc.
* Added ``RELATIVE_BASE`` settings to set date context to any datetime in past or future.
* Replaced ``dateutil.parser.parse`` with dateparser's own parser.

Improvements:

* Added simplifications for "12 noon" and "12 midnight".
* Fixed several bugs
* Replaced PyYAML library by its active fork `ruamel.yaml` which also fixed the issues with installation on windows using python35.
* More predictable ``date_formats`` handling.


0.3.5 (2016-04-27)
------------------

New features:

* Danish language support.
* Japanese language support.
* Support for parsing date strings with accents.

Improvements:

* Transformed languages.yaml into base file and separate files for each language.
* Fixed vietnamese language simplifications.
* No more version restrictions for python-dateutil.
* Timezone parsing improvements.
* Fixed test environments.
* Cleaned language codes. Now we strictly follow codes as in ISO 639-1.
* Improved chinese dates parsing.


0.3.4 (2016-03-03)
------------------

Improvements:

* Fixed broken version 0.3.3 by excluding latest python-dateutil version.

0.3.3 (2016-02-29)
------------------

New features:

* Finnish language support.

Improvements:

* Faster parsing with switching to regex module.
* ``RETURN_AS_TIMEZONE_AWARE`` setting to return tz aware date object.
* Fixed conflicts with month/weekday names similarity across languages.

0.3.2 (2016-01-25)
------------------

New features:

* Added Hijri Calendar support.
* Added settings for better control over parsing dates.
* Support to convert parsed time to the given timezone for both complete and relative dates.

Improvements:

* Fixed problem with caching `datetime.now` in `FreshnessDateDataParser`.
* Added month names and week day names abbreviations to several languages.
* More simplifications for Russian and Ukrainian languages.
* Fixed problem with parsing time component of date strings with several kinds of apostrophes.


0.3.1 (2015-10-28)
------------------

New features:

* Support for Jalali Calendar.
* Belarusian language support.
* Indonesian language support.


Improvements:

* Extended support for Russian and Polish.
* Fixed bug with time zone recognition.
* Fixed bug with incorrect translation of "second" for Portuguese.


0.3.0 (2015-07-29)
------------------

New features:

* Compatibility with Python 3 and PyPy.

Improvements:

* `languages.yaml` data cleaned up to make it human-readable.
* Improved Spanish date parsing.


0.2.1 (2015-07-13)
------------------

* Support for generic parsing of dates with UTC offset.
* Support for Tagalog/Filipino dates.
* Improved support for French and Spanish dates.


0.2.0 (2015-06-17)
------------------

* Easy to use ``parse`` function
* Languages definitions using YAML.
* Using translation based approach for parsing non-english languages. Previously, `dateutil.parserinfo` was used for language definitions.
* Better period extraction.
* Improved tests.
* Added a number of new simplifications for more comprehensive generic parsing.
* Improved validation for dates.
* Support for Polish, Thai and Arabic dates.
* Support for `pytz` timezones.
* Fixed building and packaging issues.


0.1.0 (2014-11-24)
------------------

* First release on PyPI.
