1"""
2babel.localtime._fallback
3~~~~~~~~~~~~~~~~~~~~~~~~~
4
5Emulated fallback local timezone when all else fails.
6
7:copyright: (c) 2013-2025 by the Babel Team.
8:license: BSD, see LICENSE for more details.
9"""
10
11import datetime
12import time
13
14STDOFFSET = datetime.timedelta(seconds=-time.timezone)
15DSTOFFSET = datetime.timedelta(seconds=-time.altzone) if time.daylight else STDOFFSET
16
17DSTDIFF = DSTOFFSET - STDOFFSET
18ZERO = datetime.timedelta(0)
19
20
21class _FallbackLocalTimezone(datetime.tzinfo):
22 def utcoffset(self, dt: datetime.datetime) -> datetime.timedelta:
23 if self._isdst(dt):
24 return DSTOFFSET
25 else:
26 return STDOFFSET
27
28 def dst(self, dt: datetime.datetime) -> datetime.timedelta:
29 if self._isdst(dt):
30 return DSTDIFF
31 else:
32 return ZERO
33
34 def tzname(self, dt: datetime.datetime) -> str:
35 return time.tzname[self._isdst(dt)]
36
37 def _isdst(self, dt: datetime.datetime) -> bool:
38 tt = (dt.year, dt.month, dt.day,
39 dt.hour, dt.minute, dt.second,
40 dt.weekday(), 0, -1) # fmt: skip
41 stamp = time.mktime(tt)
42 tt = time.localtime(stamp)
43 return tt.tm_isdst > 0