app/django/utils/tzinfo.py
changeset 54 03e267d67478
child 323 ff1a9aa48cfd
equal deleted inserted replaced
53:57b4279d8c4e 54:03e267d67478
       
     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:
       
    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