Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,12 @@ jobs:
toxenv: docs
- python-version: "3.14"
toxenv: twinecheck
- python-version: "3.13"
toxenv: py
timezone: "Pacific/Auckland"
- python-version: "3.13"
toxenv: py
timezone: "Pacific/Fiji"
steps:
- uses: actions/checkout@v3
- name: 'Set up Python ${{ matrix.python-version }}'
Expand All @@ -43,7 +49,9 @@ jobs:
python -m pip install --upgrade pip
pip install tox
- name: Run tests
run: tox -e ${{ matrix.toxenv || 'py' }}
run: |
TZ=${{ matrix.timezone || 'UTC' }} echo "Running tests with timezone: $TZ"
TZ=${{ matrix.timezone || 'UTC' }} tox -e ${{ matrix.toxenv || 'py' }}
- name: Upload coverage.xml to codecov
uses: codecov/codecov-action@v5
with:
Expand Down
2 changes: 1 addition & 1 deletion README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ 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://dateparser-demo.netlify.app/>`__!
it quickly by visiting `this online demo <https://gnyman.github.io/dateparser-demo-app/>`__!



Expand Down
132 changes: 100 additions & 32 deletions dateparser/data/date_translation_data/bs-Cyrl.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,8 @@
],
"monday": [
"пон",
"понедељак"
"понедељак",
"понедјељак"
],
"tuesday": [
"уто",
Expand All @@ -74,53 +75,77 @@
],
"sunday": [
"нед",
"недеља"
"недеља",
"недјеља"
],
"am": [
"пре подне"
"пре подне",
"пријеподне"
],
"pm": [
"поподне"
"поподне",
"послијеподне"
],
"year": [
"година"
"година",
"г",
"год",
"годинa"
],
"month": [
"месец"
"месец",
"мј",
"мјесец",
"мјесеци",
"мјесеца"
],
"week": [
"недеља"
"недеља",
"сед",
"седмица",
"седмице"
],
"day": [
"дан"
],
"hour": [
"час"
"час",
"сат"
],
"minute": [
"минут"
"минут",
"мин",
"минута"
],
"second": [
"секунд"
"секунд",
"с",
"сек",
"секунда"
],
"relative-type": {
"0 day ago": [
"данас"
],
"0 hour ago": [
"this hour"
"this hour",
"овај сат"
],
"0 minute ago": [
"this minute"
"this minute",
"ова минута"
],
"0 month ago": [
"овог месеца"
"овог месеца",
"овај мјесец"
],
"0 second ago": [
"now"
"now",
"сада"
],
"0 week ago": [
"ове недеље"
"ове недеље",
"ове седмице"
],
"0 year ago": [
"ове године"
Expand All @@ -129,10 +154,12 @@
"јуче"
],
"1 month ago": [
"прошлог месеца"
"прошлог месеца",
"прошли мјесец"
],
"1 week ago": [
"прошле недеље"
"прошле недеље",
"прошле седмице"
],
"1 year ago": [
"прошле године"
Expand All @@ -141,43 +168,68 @@
"сутра"
],
"in 1 month": [
"следећег месеца"
"следећег месеца",
"сљедећи мјесец"
],
"in 1 week": [
"следеће недеље"
"следеће недеље",
"сљедеће седмице"
],
"in 1 year": [
"следеће године"
"следеће године",
"сљедеће године"
]
},
"relative-type-regex": {
"\\1 day ago": [
"пре (\\d+[.,]?\\d*) дан",
"пре (\\d+[.,]?\\d*) дана"
"пре (\\d+[.,]?\\d*) дана",
"прије (\\d+[.,]?\\d*) дан",
"прије (\\d+[.,]?\\d*) дана"
],
"\\1 hour ago": [
"пре (\\d+[.,]?\\d*) сат",
"пре (\\d+[.,]?\\d*) сати"
"пре (\\d+[.,]?\\d*) сати",
"прије (\\d+[.,]?\\d*) сат",
"прије (\\d+[.,]?\\d*) сати"
],
"\\1 minute ago": [
"пре (\\d+[.,]?\\d*) минут",
"пре (\\d+[.,]?\\d*) минута"
"пре (\\d+[.,]?\\d*) минута",
"прије (\\d+[.,]?\\d*) мин",
"прије (\\d+[.,]?\\d*) минута",
"прије (\\d+[.,]?\\d*) минуту"
],
"\\1 month ago": [
"пре (\\d+[.,]?\\d*) месец",
"пре (\\d+[.,]?\\d*) месеци"
"пре (\\d+[.,]?\\d*) месеци",
"прије (\\d+[.,]?\\d*) мј",
"прије (\\d+[.,]?\\d*) мјесец",
"прије (\\d+[.,]?\\d*) мјесеца",
"прије (\\d+[.,]?\\d*) мјесеци"
],
"\\1 second ago": [
"пре (\\d+[.,]?\\d*) секунд",
"пре (\\d+[.,]?\\d*) секунди"
"пре (\\d+[.,]?\\d*) секунди",
"прије (\\d+[.,]?\\d*) сек",
"прије (\\d+[.,]?\\d*) секунда",
"прије (\\d+[.,]?\\d*) секунду"
],
"\\1 week ago": [
"пре (\\d+[.,]?\\d*) недеља",
"пре (\\d+[.,]?\\d*) недељу"
"пре (\\d+[.,]?\\d*) недељу",
"прије (\\d+[.,]?\\d*) сед",
"прије (\\d+[.,]?\\d*) седмица",
"прије (\\d+[.,]?\\d*) седмице",
"прије (\\d+[.,]?\\d*) седмицу"
],
"\\1 year ago": [
"пре (\\d+[.,]?\\d*) година",
"пре (\\d+[.,]?\\d*) годину"
"пре (\\d+[.,]?\\d*) годину",
"прије (\\d+[.,]?\\d*) г",
"прије (\\d+[.,]?\\d*) год",
"прије (\\d+[.,]?\\d*) година",
"прије (\\d+[.,]?\\d*) годину"
],
"in \\1 day": [
"за (\\d+[.,]?\\d*) дан",
Expand All @@ -189,23 +241,39 @@
],
"in \\1 minute": [
"за (\\d+[.,]?\\d*) минут",
"за (\\d+[.,]?\\d*) минута"
"за (\\d+[.,]?\\d*) минута",
"за (\\d+[.,]?\\d*) мин",
"за (\\d+[.,]?\\d*) минута",
"за (\\d+[.,]?\\d*) минуту"
],
"in \\1 month": [
"за (\\d+[.,]?\\d*) месец",
"за (\\d+[.,]?\\d*) месеци"
"за (\\d+[.,]?\\d*) месеци",
"за (\\d+[.,]?\\d*) мј",
"за (\\d+[.,]?\\d*) мјесец",
"за (\\d+[.,]?\\d*) мјесеца",
"за (\\d+[.,]?\\d*) мјесеци"
],
"in \\1 second": [
"за (\\d+[.,]?\\d*) секунд",
"за (\\d+[.,]?\\d*) секунди"
"за (\\d+[.,]?\\d*) секунди",
"за (\\d+[.,]?\\d*) сек",
"за (\\d+[.,]?\\d*) секунда",
"за (\\d+[.,]?\\d*) секунду"
],
"in \\1 week": [
"за (\\d+[.,]?\\d*) недеља",
"за (\\d+[.,]?\\d*) недељу"
"за (\\d+[.,]?\\d*) недељу",
"за (\\d+[.,]?\\d*) сед",
"за (\\d+[.,]?\\d*) седмица",
"за (\\d+[.,]?\\d*) седмицу",
"за (\\d+[.,]?\\d*) седмице"
],
"in \\1 year": [
"за (\\d+[.,]?\\d*) година",
"за (\\d+[.,]?\\d*) годину"
"за (\\d+[.,]?\\d*) годину",
"за (\\d+[.,]?\\d*) г",
"за (\\d+[.,]?\\d*) год"
]
},
"locale_specific": {},
Expand Down
1 change: 1 addition & 0 deletions dateparser/data/date_translation_data/en.py
Original file line number Diff line number Diff line change
Expand Up @@ -756,6 +756,7 @@
"and",
"at",
"by",
"from",
"just",
"m",
"nd",
Expand Down
56 changes: 39 additions & 17 deletions dateparser/date.py
Original file line number Diff line number Diff line change
Expand Up @@ -275,26 +275,48 @@ def _try_nospaces_parser(self):
return self._try_parser(parse_method=_parse_nospaces)

def _try_parser(self, parse_method):
_order = self._settings.DATE_ORDER
original_order = self._settings.DATE_ORDER

# Use locale date order unless DATE_ORDER was explicitly set by the caller.
if (
self._settings.PREFER_LOCALE_DATE_ORDER
and "DATE_ORDER" not in self._settings._mod_settings
):
first_order = self.locale.info.get("date_order", original_order)
else:
first_order = original_order

candidates = [first_order]

# If the caller requires a year (and not a day) and did not set DATE_ORDER,
# retry once or twice with year-biased orders to resolve month-number ambiguity.
require_parts = set(getattr(self._settings, "REQUIRE_PARTS", None) or [])
if (
"DATE_ORDER" not in self._settings._mod_settings
and "year" in require_parts
and "day" not in require_parts
):
for order in ("MYD", "YMD"):
if order not in candidates:
candidates.append(order)

translated = self._get_translated_date()

try:
if self._settings.PREFER_LOCALE_DATE_ORDER:
if "DATE_ORDER" not in self._settings._mod_settings:
self._settings.DATE_ORDER = self.locale.info.get(
"date_order", _order
for order in candidates:
self._settings.DATE_ORDER = order
try:
date_obj, period = date_parser.parse(
translated,
parse_method=parse_method,
settings=self._settings,
)
date_obj, period = date_parser.parse(
self._get_translated_date(),
parse_method=parse_method,
settings=self._settings,
)
self._settings.DATE_ORDER = _order
return DateData(
date_obj=date_obj,
period=period,
)
except ValueError:
self._settings.DATE_ORDER = _order
return DateData(date_obj=date_obj, period=period)
except ValueError:
continue
return None
finally:
self._settings.DATE_ORDER = original_order

def _try_given_formats(self):
if not self.date_formats:
Expand Down
Loading
Loading