|
""" |
|
babel.localtime._fallback |
|
~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
|
|
Emulated fallback local timezone when all else fails. |
|
|
|
:copyright: (c) 2013-2025 by the Babel Team. |
|
:license: BSD, see LICENSE for more details. |
|
""" |
|
|
|
import datetime |
|
import time |
|
|
|
STDOFFSET = datetime.timedelta(seconds=-time.timezone) |
|
DSTOFFSET = datetime.timedelta(seconds=-time.altzone) if time.daylight else STDOFFSET |
|
|
|
DSTDIFF = DSTOFFSET - STDOFFSET |
|
ZERO = datetime.timedelta(0) |
|
|
|
|
|
class _FallbackLocalTimezone(datetime.tzinfo): |
|
|
|
def utcoffset(self, dt: datetime.datetime) -> datetime.timedelta: |
|
if self._isdst(dt): |
|
return DSTOFFSET |
|
else: |
|
return STDOFFSET |
|
|
|
def dst(self, dt: datetime.datetime) -> datetime.timedelta: |
|
if self._isdst(dt): |
|
return DSTDIFF |
|
else: |
|
return ZERO |
|
|
|
def tzname(self, dt: datetime.datetime) -> str: |
|
return time.tzname[self._isdst(dt)] |
|
|
|
def _isdst(self, dt: datetime.datetime) -> bool: |
|
tt = (dt.year, dt.month, dt.day, |
|
dt.hour, dt.minute, dt.second, |
|
dt.weekday(), 0, -1) |
|
stamp = time.mktime(tt) |
|
tt = time.localtime(stamp) |
|
return tt.tm_isdst > 0 |
|
|