Source code for pytds.tz

from __future__ import annotations

import datetime
import time as _time
from datetime import tzinfo, timedelta

ZERO = timedelta(0)
HOUR = timedelta(hours=1)


# A class building tzinfo objects for fixed-offset time zones.
# Note that FixedOffset(0, "UTC") is a different way to build a
# UTC tzinfo object.


[docs] class FixedOffsetTimezone(tzinfo): """Fixed offset in minutes east from UTC.""" def __init__(self, offset: float, name: str | None=None) -> None: self.__offset = timedelta(minutes=offset) self.__name = name
[docs] def utcoffset(self, dt: datetime.datetime | None) -> timedelta: return self.__offset
[docs] def tzname(self, dt: datetime.datetime | None) -> str | None: return self.__name
[docs] def dst(self, dt: datetime.datetime | None) -> timedelta: return ZERO
utc = FixedOffsetTimezone(offset=0, name="UTC") STDOFFSET = timedelta(seconds=-_time.timezone) if _time.daylight: DSTOFFSET = timedelta(seconds=-_time.altzone) else: DSTOFFSET = STDOFFSET DSTDIFF = DSTOFFSET - STDOFFSET
[docs] class LocalTimezone(tzinfo):
[docs] def utcoffset(self, dt: datetime.datetime | None) -> timedelta: if self._isdst(dt): return DSTOFFSET else: return STDOFFSET
[docs] def dst(self, dt: datetime.datetime | None) -> timedelta: if self._isdst(dt): return DSTDIFF else: return ZERO
[docs] def tzname(self, dt: datetime.datetime | None) -> str: return _time.tzname[self._isdst(dt)]
def _isdst(self, dt: datetime.datetime | None) -> bool: if not dt: return False tt = ( dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.weekday(), 0, 0, ) stamp = _time.mktime(tt) tt = _time.localtime(stamp) return tt.tm_isdst > 0
local = LocalTimezone()