Fixed #5846 -- Bullet-proofed the default timezone encoding test.
[django.git] / django / utils / tzinfo.py
blobd8bdee390a9c07e18e80c28b94716c7a67e1b53f
1 "Implementation of tzinfo classes for use with datetime.datetime."
3 import locale
4 import time
5 from datetime import timedelta, tzinfo
6 from django.utils.encoding import smart_unicode
8 try:
9 DEFAULT_ENCODING = locale.getdefaultlocale()[1] or 'ascii'
10 except:
11 # Any problems at all determining the locale and we fallback. See #5846.
12 DEFAULT_ENCODING = 'ascii'
14 class FixedOffset(tzinfo):
15 "Fixed offset in minutes east from UTC."
16 def __init__(self, offset):
17 self.__offset = timedelta(minutes=offset)
18 self.__name = u"%+03d%02d" % (offset // 60, offset % 60)
20 def __repr__(self):
21 return self.__name
23 def utcoffset(self, dt):
24 return self.__offset
26 def tzname(self, dt):
27 return self.__name
29 def dst(self, dt):
30 return timedelta(0)
32 class LocalTimezone(tzinfo):
33 "Proxy timezone information from time module."
34 def __init__(self, dt):
35 tzinfo.__init__(self, dt)
36 self._tzname = self.tzname(dt)
38 def __repr__(self):
39 return self._tzname
41 def utcoffset(self, dt):
42 if self._isdst(dt):
43 return timedelta(seconds=-time.altzone)
44 else:
45 return timedelta(seconds=-time.timezone)
47 def dst(self, dt):
48 if self._isdst(dt):
49 return timedelta(seconds=-time.altzone) - timedelta(seconds=-time.timezone)
50 else:
51 return timedelta(0)
53 def tzname(self, dt):
54 try:
55 return smart_unicode(time.tzname[self._isdst(dt)], DEFAULT_ENCODING)
56 except UnicodeDecodeError:
57 return None
59 def _isdst(self, dt):
60 tt = (dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.weekday(), 0, -1)
61 try:
62 stamp = time.mktime(tt)
63 except OverflowError:
64 # 32 bit systems can't handle dates after Jan 2038, so we fake it
65 # in that case (since we only care about the DST flag here).
66 tt = (2037,) + tt[1:]
67 stamp = time.mktime(tt)
68 tt = time.localtime(stamp)
69 return tt.tm_isdst > 0