diff options
Diffstat (limited to 'webapp/django/utils/tzinfo.py')
-rw-r--r-- | webapp/django/utils/tzinfo.py | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/webapp/django/utils/tzinfo.py b/webapp/django/utils/tzinfo.py new file mode 100644 index 0000000000..58cfcd5d88 --- /dev/null +++ b/webapp/django/utils/tzinfo.py @@ -0,0 +1,82 @@ +"Implementation of tzinfo classes for use with datetime.datetime." + +import locale +import time +from datetime import timedelta, tzinfo +from django.utils.encoding import smart_unicode + +try: + DEFAULT_ENCODING = locale.getdefaultlocale()[1] or 'ascii' +except: + # Any problems at all determining the locale and we fallback. See #5846. + DEFAULT_ENCODING = 'ascii' + +class FixedOffset(tzinfo): + "Fixed offset in minutes east from UTC." + def __init__(self, offset): + if isinstance(offset, timedelta): + self.__offset = offset + offset = self.__offset.seconds // 60 + else: + self.__offset = timedelta(minutes=offset) + + self.__name = u"%+03d%02d" % (offset / 60, offset % 60) + + def __repr__(self): + return self.__name + + def utcoffset(self, dt): + return self.__offset + + def tzname(self, dt): + return self.__name + + def dst(self, dt): + return timedelta(0) + +class LocalTimezone(tzinfo): + "Proxy timezone information from time module." + def __init__(self, dt): + tzinfo.__init__(self) + self._tzname = self.tzname(dt) + + def __repr__(self): + return self._tzname + + def utcoffset(self, dt): + if self._isdst(dt): + return timedelta(seconds=-time.altzone) + else: + return timedelta(seconds=-time.timezone) + + def dst(self, dt): + if self._isdst(dt): + return timedelta(seconds=-time.altzone) - timedelta(seconds=-time.timezone) + else: + return timedelta(0) + + def tzname(self, dt): + try: + return smart_unicode(time.tzname[self._isdst(dt)], DEFAULT_ENCODING) + except UnicodeDecodeError: + return None + + def _isdst(self, dt): + tt = (dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.weekday(), 0, -1) + try: + stamp = time.mktime(tt) + except (OverflowError, ValueError): + # 32 bit systems can't handle dates after Jan 2038, and certain + # systems can't handle dates before ~1901-12-01: + # + # >>> time.mktime((1900, 1, 13, 0, 0, 0, 0, 0, 0)) + # OverflowError: mktime argument out of range + # >>> time.mktime((1850, 1, 13, 0, 0, 0, 0, 0, 0)) + # ValueError: year out of range + # + # In this case, we fake the date, because we only care about the + # DST flag. + tt = (2037,) + tt[1:] + stamp = time.mktime(tt) + tt = time.localtime(stamp) + return tt.tm_isdst > 0 |