⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tz.py

📁 Python的一个ORM,现在很火
💻 PY
📖 第 1 页 / 共 3 页
字号:
"""Copyright (c) 2003-2005  Gustavo Niemeyer <gustavo@niemeyer.net>This module offers extensions to the standard python 2.3+datetime module."""__author__ = "Gustavo Niemeyer <gustavo@niemeyer.net>"__license__ = "PSF License"import datetimeimport structimport timeimport sysimport osrelativedelta = Noneparser = Nonerrule = None__all__ = ["tzutc", "tzoffset", "tzlocal", "tzfile", "tzrange",           "tzstr", "tzical", "tzwin", "tzwinlocal", "gettz"]try:    from dateutil.tzwin import tzwin, tzwinlocalexcept (ImportError, OSError):    tzwin, tzwinlocal = None, NoneZERO = datetime.timedelta(0)EPOCHORDINAL = datetime.datetime.utcfromtimestamp(0).toordinal()class tzutc(datetime.tzinfo):    def utcoffset(self, dt):        return ZERO         def dst(self, dt):        return ZERO    def tzname(self, dt):        return "UTC"    def __eq__(self, other):        return (isinstance(other, tzutc) or                (isinstance(other, tzoffset) and other._offset == ZERO))    def __ne__(self, other):        return not self.__eq__(other)    def __repr__(self):        return "%s()" % self.__class__.__name__    __reduce__ = object.__reduce__class tzoffset(datetime.tzinfo):    def __init__(self, name, offset):        self._name = name        self._offset = datetime.timedelta(seconds=offset)    def utcoffset(self, dt):        return self._offset    def dst(self, dt):        return ZERO    def tzname(self, dt):        return self._name    def __eq__(self, other):        return (isinstance(other, tzoffset) and                self._offset == other._offset)    def __ne__(self, other):        return not self.__eq__(other)    def __repr__(self):        return "%s(%s, %s)" % (self.__class__.__name__,                               `self._name`,                               self._offset.days*86400+self._offset.seconds)    __reduce__ = object.__reduce__class tzlocal(datetime.tzinfo):    _std_offset = datetime.timedelta(seconds=-time.timezone)    if time.daylight:        _dst_offset = datetime.timedelta(seconds=-time.altzone)    else:        _dst_offset = _std_offset    def utcoffset(self, dt):        if self._isdst(dt):            return self._dst_offset        else:            return self._std_offset    def dst(self, dt):        if self._isdst(dt):            return self._dst_offset-self._std_offset        else:            return ZERO    def tzname(self, dt):        return time.tzname[self._isdst(dt)]    def _isdst(self, dt):        # We can't use mktime here. It is unstable when deciding if        # the hour near to a change is DST or not.        #         # timestamp = time.mktime((dt.year, dt.month, dt.day, dt.hour,        #                         dt.minute, dt.second, dt.weekday(), 0, -1))        # return time.localtime(timestamp).tm_isdst        #        # The code above yields the following result:        #        #>>> import tz, datetime        #>>> t = tz.tzlocal()        #>>> datetime.datetime(2003,2,15,23,tzinfo=t).tzname()        #'BRDT'        #>>> datetime.datetime(2003,2,16,0,tzinfo=t).tzname()        #'BRST'        #>>> datetime.datetime(2003,2,15,23,tzinfo=t).tzname()        #'BRST'        #>>> datetime.datetime(2003,2,15,22,tzinfo=t).tzname()        #'BRDT'        #>>> datetime.datetime(2003,2,15,23,tzinfo=t).tzname()        #'BRDT'        #        # Here is a more stable implementation:        #        timestamp = ((dt.toordinal() - EPOCHORDINAL) * 86400                     + dt.hour * 3600                     + dt.minute * 60                     + dt.second)        return time.localtime(timestamp+time.timezone).tm_isdst    def __eq__(self, other):        if not isinstance(other, tzlocal):            return False        return (self._std_offset == other._std_offset and                self._dst_offset == other._dst_offset)        return True    def __ne__(self, other):        return not self.__eq__(other)    def __repr__(self):        return "%s()" % self.__class__.__name__    __reduce__ = object.__reduce__class _ttinfo(object):    __slots__ = ["offset", "delta", "isdst", "abbr", "isstd", "isgmt"]    def __init__(self):        for attr in self.__slots__:            setattr(self, attr, None)    def __repr__(self):        l = []        for attr in self.__slots__:            value = getattr(self, attr)            if value is not None:                l.append("%s=%s" % (attr, `value`))        return "%s(%s)" % (self.__class__.__name__, ", ".join(l))    def __eq__(self, other):        if not isinstance(other, _ttinfo):            return False        return (self.offset == other.offset and                self.delta == other.delta and                self.isdst == other.isdst and                self.abbr == other.abbr and                self.isstd == other.isstd and                self.isgmt == other.isgmt)    def __ne__(self, other):        return not self.__eq__(other)    def __getstate__(self):        state = {}        for name in self.__slots__:            state[name] = getattr(self, name, None)        return state    def __setstate__(self, state):        for name in self.__slots__:            if name in state:                setattr(self, name, state[name])class tzfile(datetime.tzinfo):    # http://www.twinsun.com/tz/tz-link.htm    # ftp://elsie.nci.nih.gov/pub/tz*.tar.gz        def __init__(self, fileobj):        if isinstance(fileobj, basestring):            self._filename = fileobj            fileobj = open(fileobj)        elif hasattr(fileobj, "name"):            self._filename = fileobj.name        else:            self._filename = `fileobj`        # From tzfile(5):        #        # The time zone information files used by tzset(3)        # begin with the magic characters "TZif" to identify        # them as time zone information files, followed by        # sixteen bytes reserved for future use, followed by        # six four-byte values of type long, written in a        # ``standard'' byte order (the high-order  byte        # of the value is written first).        if fileobj.read(4) != "TZif":            raise ValueError, "magic not found"        fileobj.read(16)        (         # The number of UTC/local indicators stored in the file.         ttisgmtcnt,         # The number of standard/wall indicators stored in the file.         ttisstdcnt,                  # The number of leap seconds for which data is         # stored in the file.         leapcnt,         # The number of "transition times" for which data         # is stored in the file.         timecnt,         # The number of "local time types" for which data         # is stored in the file (must not be zero).         typecnt,         # The  number  of  characters  of "time zone         # abbreviation strings" stored in the file.         charcnt,        ) = struct.unpack(">6l", fileobj.read(24))        # The above header is followed by tzh_timecnt four-byte        # values  of  type long,  sorted  in ascending order.        # These values are written in ``standard'' byte order.        # Each is used as a transition time (as  returned  by        # time(2)) at which the rules for computing local time        # change.        if timecnt:            self._trans_list = struct.unpack(">%dl" % timecnt,                                             fileobj.read(timecnt*4))        else:            self._trans_list = []        # Next come tzh_timecnt one-byte values of type unsigned        # char; each one tells which of the different types of        # ``local time'' types described in the file is associated        # with the same-indexed transition time. These values        # serve as indices into an array of ttinfo structures that        # appears next in the file.                if timecnt:            self._trans_idx = struct.unpack(">%dB" % timecnt,                                            fileobj.read(timecnt))        else:            self._trans_idx = []                # Each ttinfo structure is written as a four-byte value        # for tt_gmtoff  of  type long,  in  a  standard  byte        # order, followed  by a one-byte value for tt_isdst        # and a one-byte  value  for  tt_abbrind.   In  each        # structure, tt_gmtoff  gives  the  number  of        # seconds to be added to UTC, tt_isdst tells whether        # tm_isdst should be set by  localtime(3),  and        # tt_abbrind serves  as an index into the array of        # time zone abbreviation characters that follow the        # ttinfo structure(s) in the file.        ttinfo = []        for i in range(typecnt):            ttinfo.append(struct.unpack(">lbb", fileobj.read(6)))        abbr = fileobj.read(charcnt)        # Then there are tzh_leapcnt pairs of four-byte        # values, written in  standard byte  order;  the        # first  value  of  each pair gives the time (as        # returned by time(2)) at which a leap second        # occurs;  the  second  gives the  total  number of        # leap seconds to be applied after the given time.        # The pairs of values are sorted in ascending order        # by time.        # Not used, for now        if leapcnt:            leap = struct.unpack(">%dl" % leapcnt*2,                                 fileobj.read(leapcnt*8))        # Then there are tzh_ttisstdcnt standard/wall        # indicators, each stored as a one-byte value;        # they tell whether the transition times associated        # with local time types were specified as standard        # time or wall clock time, and are used when        # a time zone file is used in handling POSIX-style        # time zone environment variables.        if ttisstdcnt:            isstd = struct.unpack(">%db" % ttisstdcnt,                                  fileobj.read(ttisstdcnt))

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -