12 DEFAULT_ENCODING = 'ascii' |
12 DEFAULT_ENCODING = 'ascii' |
13 |
13 |
14 class FixedOffset(tzinfo): |
14 class FixedOffset(tzinfo): |
15 "Fixed offset in minutes east from UTC." |
15 "Fixed offset in minutes east from UTC." |
16 def __init__(self, offset): |
16 def __init__(self, offset): |
17 self.__offset = timedelta(minutes=offset) |
17 if isinstance(offset, timedelta): |
18 self.__name = u"%+03d%02d" % (offset // 60, offset % 60) |
18 self.__offset = offset |
|
19 offset = self.__offset.seconds // 60 |
|
20 else: |
|
21 self.__offset = timedelta(minutes=offset) |
|
22 |
|
23 self.__name = u"%+03d%02d" % (offset / 60, offset % 60) |
19 |
24 |
20 def __repr__(self): |
25 def __repr__(self): |
21 return self.__name |
26 return self.__name |
22 |
27 |
23 def utcoffset(self, dt): |
28 def utcoffset(self, dt): |
30 return timedelta(0) |
35 return timedelta(0) |
31 |
36 |
32 class LocalTimezone(tzinfo): |
37 class LocalTimezone(tzinfo): |
33 "Proxy timezone information from time module." |
38 "Proxy timezone information from time module." |
34 def __init__(self, dt): |
39 def __init__(self, dt): |
35 tzinfo.__init__(self, dt) |
40 tzinfo.__init__(self) |
36 self._tzname = self.tzname(dt) |
41 self._tzname = self.tzname(dt) |
37 |
42 |
38 def __repr__(self): |
43 def __repr__(self): |
39 return self._tzname |
44 return self._tzname |
40 |
45 |
58 |
63 |
59 def _isdst(self, dt): |
64 def _isdst(self, dt): |
60 tt = (dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.weekday(), 0, -1) |
65 tt = (dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.weekday(), 0, -1) |
61 try: |
66 try: |
62 stamp = time.mktime(tt) |
67 stamp = time.mktime(tt) |
63 except OverflowError: |
68 except (OverflowError, ValueError): |
64 # 32 bit systems can't handle dates after Jan 2038, so we fake it |
69 # 32 bit systems can't handle dates after Jan 2038, and certain |
65 # in that case (since we only care about the DST flag here). |
70 # systems can't handle dates before ~1901-12-01: |
|
71 # |
|
72 # >>> time.mktime((1900, 1, 13, 0, 0, 0, 0, 0, 0)) |
|
73 # OverflowError: mktime argument out of range |
|
74 # >>> time.mktime((1850, 1, 13, 0, 0, 0, 0, 0, 0)) |
|
75 # ValueError: year out of range |
|
76 # |
|
77 # In this case, we fake the date, because we only care about the |
|
78 # DST flag. |
66 tt = (2037,) + tt[1:] |
79 tt = (2037,) + tt[1:] |
67 stamp = time.mktime(tt) |
80 stamp = time.mktime(tt) |
68 tt = time.localtime(stamp) |
81 tt = time.localtime(stamp) |
69 return tt.tm_isdst > 0 |
82 return tt.tm_isdst > 0 |