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()