1"""
2 babel.localtime._fallback
3 ~~~~~~~~~~~~~~~~~~~~~~~~~
4
5 Emulated fallback local timezone when all else fails.
6
7 :copyright: (c) 2013-2024 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
23 def utcoffset(self, dt: datetime.datetime) -> datetime.timedelta:
24 if self._isdst(dt):
25 return DSTOFFSET
26 else:
27 return STDOFFSET
28
29 def dst(self, dt: datetime.datetime) -> datetime.timedelta:
30 if self._isdst(dt):
31 return DSTDIFF
32 else:
33 return ZERO
34
35 def tzname(self, dt: datetime.datetime) -> str:
36 return time.tzname[self._isdst(dt)]
37
38 def _isdst(self, dt: datetime.datetime) -> bool:
39 tt = (dt.year, dt.month, dt.day,
40 dt.hour, dt.minute, dt.second,
41 dt.weekday(), 0, -1)
42 stamp = time.mktime(tt)
43 tt = time.localtime(stamp)
44 return tt.tm_isdst > 0