summaryrefslogtreecommitdiff
path: root/babel/localtime/_fallback.py
diff options
context:
space:
mode:
Diffstat (limited to 'babel/localtime/_fallback.py')
-rw-r--r--babel/localtime/_fallback.py47
1 files changed, 47 insertions, 0 deletions
diff --git a/babel/localtime/_fallback.py b/babel/localtime/_fallback.py
new file mode 100644
index 0000000..836f596
--- /dev/null
+++ b/babel/localtime/_fallback.py
@@ -0,0 +1,47 @@
+"""
+ babel.localtime._fallback
+ ~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Emulated fallback local timezone when all else fails.
+
+ :copyright: (c) 2013-2023 by the Babel Team.
+ :license: BSD, see LICENSE for more details.
+"""
+
+import datetime
+import time
+
+STDOFFSET = datetime.timedelta(seconds=-time.timezone)
+if time.daylight:
+ DSTOFFSET = datetime.timedelta(seconds=-time.altzone)
+else:
+ DSTOFFSET = 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