Skip to content

Releases

1.5.0

Choose a tag to compare

@AdrianAtZyte AdrianAtZyte released this 04 Nov 12:42

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 ...
Read more

1.4.3

Choose a tag to compare

@serhii73 serhii73 released this 03 Sep 10:07
9ce60b1

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

Choose a tag to compare

@serhii73 serhii73 released this 04 Aug 12:10
b1f603e

New features

  • Add an IGNORE_SURROUNDING_TEXT setting that, when enabled, retries parsing after ignoring 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

Choose a tag to compare

@serhii73 serhii73 released this 15 Jun 08:44
08c78d3

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

Choose a tag to compare

@AdrianAtZyte AdrianAtZyte released this 26 Mar 09:55

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

Choose a tag to compare

@Gallaecio Gallaecio released this 04 Feb 15:59

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)

Release v1.2.2

Choose a tag to compare

@Gallaecio Gallaecio released this 26 Jun 09:28

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)

Release v1.2.1

Choose a tag to compare

@serhii73 serhii73 released this 05 Feb 12:34

1.2.1

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

Choose a tag to compare

@Gallaecio Gallaecio released this 17 Nov 10:47

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)

Release 1.1.8

Choose a tag to compare

@serhii73 serhii73 released this 23 Mar 14:01
7b469b1

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)