Django

Code

root/django/branches/gis/django/utils/tzinfo.py

Revision 7979, 2.4 kB (checked in by jbronn, 4 months ago)

gis: Merged revisions 7921,7926-7928,7938-7941,7945-7947,7949-7950,7952,7955-7956,7961,7964-7968,7970-7978 via svnmerge from trunk.

This includes the newforms-admin branch, and thus is backwards-incompatible. The geographic admin is _not_ in this changeset, and is forthcoming.

  • Property svn:eol-style set to native
Line 
1 "Implementation of tzinfo classes for use with datetime.datetime."
2
3 import locale
4 import time
5 from datetime import timedelta, tzinfo
6 from django.utils.encoding import smart_unicode
7
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'
13
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)
19
20     def __repr__(self):
21         return self.__name
22
23     def utcoffset(self, dt):
24         return self.__offset
25
26     def tzname(self, dt):
27         return self.__name
28
29     def dst(self, dt):
30         return timedelta(0)
31
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)
37
38     def __repr__(self):
39         return self._tzname
40
41     def utcoffset(self, dt):
42         if self._isdst(dt):
43             return timedelta(seconds=-time.altzone)
44         else:
45             return timedelta(seconds=-time.timezone)
46
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)
52
53     def tzname(self, dt):
54         try:
55             return smart_unicode(time.tzname[self._isdst(dt)], DEFAULT_ENCODING)
56         except UnicodeDecodeError:
57             return None
58
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, ValueError):
64             # 32 bit systems can't handle dates after Jan 2038, and certain
65             # systems can't handle dates before ~1901-12-01:
66             #
67             # >>> time.mktime((1900, 1, 13, 0, 0, 0, 0, 0, 0))
68             # OverflowError: mktime argument out of range
69             # >>> time.mktime((1850, 1, 13, 0, 0, 0, 0, 0, 0))
70             # ValueError: year out of range
71             #
72             # In this case, we fake the date, because we only care about the
73             # DST flag.
74             tt = (2037,) + tt[1:]
75             stamp = time.mktime(tt)
76         tt = time.localtime(stamp)
77         return tt.tm_isdst > 0
Note: See TracBrowser for help on using the browser.