Source code for icalendar.timezone.pytz

"""Use pytz timezones."""

from __future__ import annotations

from datetime import datetime, tzinfo
from typing import TYPE_CHECKING, Optional

import pytz
from pytz.tzinfo import DstTzInfo

from .provider import TZProvider

if TYPE_CHECKING:
    from dateutil.rrule import rrule

    from icalendar import prop
    from icalendar.cal import Timezone


[docs] class PYTZ(TZProvider): """Provide icalendar with timezones from pytz.""" name = "pytz"
[docs] def localize_utc(self, dt: datetime) -> datetime: """Return the datetime in UTC.""" if getattr(dt, "tzinfo", False) and dt.tzinfo is not None: return dt.astimezone(pytz.utc) # assume UTC for naive datetime instances return pytz.utc.localize(dt)
[docs] def localize(self, dt: datetime, tz: tzinfo) -> datetime: """Localize a datetime to a timezone.""" return tz.localize(dt)
[docs] def knows_timezone_id(self, id: str) -> bool: """Whether the timezone is already cached by the implementation.""" return id in pytz.all_timezones
[docs] def fix_rrule_until(self, rrule: rrule, ical_rrule: prop.vRecur) -> None: """Make sure the until value works for the rrule generated from the ical_rrule.""" if not {"UNTIL", "COUNT"}.intersection(ical_rrule.keys()): # pytz.timezones don't know any transition dates after 2038 # either rrule._until = datetime(2038, 12, 31, tzinfo=pytz.UTC)
[docs] def create_timezone(self, tz: Timezone.Timezone) -> tzinfo: """Create a pytz timezone from the given information.""" transition_times, transition_info = tz.get_transitions() name = tz.tz_name cls = type( name, (DstTzInfo,), { "zone": name, "_utc_transition_times": transition_times, "_transition_info": transition_info, }, ) return cls()
[docs] def timezone(self, name: str) -> Optional[tzinfo]: """Return a timezone with a name or None if we cannot find it.""" try: return pytz.timezone(name) except pytz.UnknownTimeZoneError: pass
[docs] def uses_pytz(self) -> bool: """Whether we use pytz.""" return True
[docs] def uses_zoneinfo(self) -> bool: """Whether we use zoneinfo.""" return False
__all__ = ["PYTZ"]