from __future__ import annotations import datetime import re from typing import cast from pendulum.constants import HOURS_PER_DAY from pendulum.constants import MINUTES_PER_HOUR from pendulum.constants import MONTHS_OFFSETS from pendulum.constants import SECONDS_PER_MINUTE from pendulum.duration import Duration from pendulum.helpers import days_in_year from pendulum.helpers import is_leap from pendulum.helpers import is_long_year from pendulum.helpers import week_day from pendulum.parsing.exceptions import ParserError from pendulum.tz.timezone import UTC from pendulum.tz.timezone import FixedTimezone ISO8601_DT = re.compile( # Date (optional) # noqa: E800 "^" "(?P" " (?P" # Classic date (YYYY-MM-DD) or ordinal (YYYY-DDD) r" (?P\d{4})" # Year " (?P" r" (?P-)?(?P\d{2})" # Month (optional) r" ((?P-)?(?P\d{1,2}))?" # Day (optional) " )?" " )" " |" " (?P" # Calendar date (2016-W05 or 2016-W05-5) r" (?P\d{4})" # Year " (?P-)?" # Separator (optional) " W" # W separator r" (?P\d{2})" # Week number " (?P-)?" # Separator (optional) r" (?P\d)?" # Weekday (optional) " )" ")?" # Time (optional) # noqa: E800 "(?P