diff --git a/taskiq/cli/scheduler/run.py b/taskiq/cli/scheduler/run.py index 06382c43..744ca0f4 100644 --- a/taskiq/cli/scheduler/run.py +++ b/taskiq/cli/scheduler/run.py @@ -4,7 +4,7 @@ from datetime import datetime, timedelta, timezone from logging import basicConfig, getLogger from typing import Any, TypeAlias -from zoneinfo import ZoneInfo +from zoneinfo import ZoneInfo, ZoneInfoNotFoundError import pycron @@ -99,7 +99,13 @@ def is_cron_task_now( # If timezone was specified as string we convert it timezone # offset and then apply. elif offset and isinstance(offset, str): - now = now.astimezone(ZoneInfo(offset)) + try: + now = now.astimezone(ZoneInfo(offset)) + # ZoneInfoNotFoundError for unknown keys, ModuleNotFoundError + # for systems without timezone data available (e.g. missing + # tzdata on Windows). + except (ZoneInfoNotFoundError, ModuleNotFoundError) as e: + raise CronValueError(e) from e try: return pycron.is_now(cron_value, now) diff --git a/tests/cli/scheduler/test_is_cron_task_now.py b/tests/cli/scheduler/test_is_cron_task_now.py index bbbe079b..36b1365a 100644 --- a/tests/cli/scheduler/test_is_cron_task_now.py +++ b/tests/cli/scheduler/test_is_cron_task_now.py @@ -75,3 +75,16 @@ def test_is_cron_task_now( def test_is_cron_task_now_invalid_cron() -> None: with pytest.raises(CronValueError): is_cron_task_now("invalid cron", datetime.now()) + + +@pytest.mark.parametrize( + "offset", + ["UTC+3", "Europa/Madrid"], +) +def test_is_cron_task_now_invalid_offset_string(offset: str) -> None: + with pytest.raises(CronValueError): + is_cron_task_now( + cron_value="* * * * *", + now=datetime.now(timezone.utc), + offset=offset, + )