web/lib/django/utils/tzinfo.py
changeset 0 0d40e90630ef
child 29 cc9b7e14412b
equal deleted inserted replaced
-1:000000000000 0:0d40e90630ef
       
     1 "Implementation of tzinfo classes for use with datetime.datetime."
       
     2 
       
     3 import time
       
     4 from datetime import timedelta, tzinfo
       
     5 from django.utils.encoding import smart_unicode, smart_str, DEFAULT_LOCALE_ENCODING
       
     6 
       
     7 class FixedOffset(tzinfo):
       
     8     "Fixed offset in minutes east from UTC."
       
     9     def __init__(self, offset):
       
    10         if isinstance(offset, timedelta):
       
    11             self.__offset = offset
       
    12             offset = self.__offset.seconds // 60
       
    13         else:
       
    14             self.__offset = timedelta(minutes=offset)
       
    15 
       
    16         self.__name = u"%+03d%02d" % (offset / 60, offset % 60)
       
    17 
       
    18     def __repr__(self):
       
    19         return self.__name
       
    20 
       
    21     def utcoffset(self, dt):
       
    22         return self.__offset
       
    23 
       
    24     def tzname(self, dt):
       
    25         return self.__name
       
    26 
       
    27     def dst(self, dt):
       
    28         return timedelta(0)
       
    29 
       
    30 class LocalTimezone(tzinfo):
       
    31     "Proxy timezone information from time module."
       
    32     def __init__(self, dt):
       
    33         tzinfo.__init__(self)
       
    34         self._tzname = self.tzname(dt)
       
    35 
       
    36     def __repr__(self):
       
    37         return smart_str(self._tzname)
       
    38 
       
    39     def utcoffset(self, dt):
       
    40         if self._isdst(dt):
       
    41             return timedelta(seconds=-time.altzone)
       
    42         else:
       
    43             return timedelta(seconds=-time.timezone)
       
    44 
       
    45     def dst(self, dt):
       
    46         if self._isdst(dt):
       
    47             return timedelta(seconds=-time.altzone) - timedelta(seconds=-time.timezone)
       
    48         else:
       
    49             return timedelta(0)
       
    50 
       
    51     def tzname(self, dt):
       
    52         try:
       
    53             return smart_unicode(time.tzname[self._isdst(dt)],
       
    54                                  DEFAULT_LOCALE_ENCODING)
       
    55         except UnicodeDecodeError:
       
    56             return None
       
    57 
       
    58     def _isdst(self, dt):
       
    59         tt = (dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.weekday(), 0, -1)
       
    60         try:
       
    61             stamp = time.mktime(tt)
       
    62         except (OverflowError, ValueError):
       
    63             # 32 bit systems can't handle dates after Jan 2038, and certain
       
    64             # systems can't handle dates before ~1901-12-01:
       
    65             #
       
    66             # >>> time.mktime((1900, 1, 13, 0, 0, 0, 0, 0, 0))
       
    67             # OverflowError: mktime argument out of range
       
    68             # >>> time.mktime((1850, 1, 13, 0, 0, 0, 0, 0, 0))
       
    69             # ValueError: year out of range
       
    70             #
       
    71             # In this case, we fake the date, because we only care about the
       
    72             # DST flag.
       
    73             tt = (2037,) + tt[1:]
       
    74             stamp = time.mktime(tt)
       
    75         tt = time.localtime(stamp)
       
    76         return tt.tm_isdst > 0