883ff166140020937258bdf1b441e354b57fefb2
[sdc/sdc-distribution-client.git] /
1 # -*- coding: utf-8 -*-
2 """
3     babel.localtime
4     ~~~~~~~~~~~~~~~
5
6     Babel specific fork of tzlocal to determine the local timezone
7     of the system.
8
9     :copyright: (c) 2013 by the Babel Team.
10     :license: BSD, see LICENSE for more details.
11 """
12
13 import sys
14 import pytz
15 import time
16 from datetime import timedelta
17 from datetime import tzinfo
18 from threading import RLock
19
20 if sys.platform == 'win32':
21     from babel.localtime._win32 import _get_localzone
22 else:
23     from babel.localtime._unix import _get_localzone
24
25
26 _cached_tz = None
27 _cache_lock = RLock()
28
29 STDOFFSET = timedelta(seconds=-time.timezone)
30 if time.daylight:
31     DSTOFFSET = timedelta(seconds=-time.altzone)
32 else:
33     DSTOFFSET = STDOFFSET
34
35 DSTDIFF = DSTOFFSET - STDOFFSET
36 ZERO = timedelta(0)
37
38
39 class _FallbackLocalTimezone(tzinfo):
40
41     def utcoffset(self, dt):
42         if self._isdst(dt):
43             return DSTOFFSET
44         else:
45             return STDOFFSET
46
47     def dst(self, dt):
48         if self._isdst(dt):
49             return DSTDIFF
50         else:
51             return ZERO
52
53     def tzname(self, dt):
54         return time.tzname[self._isdst(dt)]
55
56     def _isdst(self, dt):
57         tt = (dt.year, dt.month, dt.day,
58               dt.hour, dt.minute, dt.second,
59               dt.weekday(), 0, -1)
60         stamp = time.mktime(tt)
61         tt = time.localtime(stamp)
62         return tt.tm_isdst > 0
63
64
65 def get_localzone():
66     """Returns the current underlying local timezone object.
67     Generally this function does not need to be used, it's a
68     better idea to use the :data:`LOCALTZ` singleton instead.
69     """
70     return _get_localzone()
71
72
73 try:
74     LOCALTZ = get_localzone()
75 except pytz.UnknownTimeZoneError:
76     LOCALTZ = _FallbackLocalTimezone()