_fallback.py 1.2 KB

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