#!/usr/bin/env python'''$Id: tzfile.py,v 1.8 2004年06月03日 00:15:24 zenzen Exp $'''from cStringIO import StringIOfrom datetime import datetime, timedeltafrom struct import unpack, calcsizefrom pytz.tzinfo import StaticTzInfo, DstTzInfo, memorized_ttinfofrom pytz.tzinfo import memorized_datetime, memorized_timedeltadef build_tzinfo(zone, fp):head_fmt = '>4s 16x 6l'head_size = calcsize(head_fmt)(magic,ttisgmtcnt,ttisstdcnt,leapcnt,timecnt,typecnt,charcnt) = unpack(head_fmt, fp.read(head_size))# Make sure it is a tzinfo(5) fileassert magic == 'TZif'# Read out the transition times, localtime indices and ttinfo structures.data_fmt = '>%(timecnt)dl %(timecnt)dB %(ttinfo)s %(charcnt)ds' % dict(timecnt=timecnt, ttinfo='lBB'*typecnt, charcnt=charcnt)data_size = calcsize(data_fmt)data = unpack(data_fmt, fp.read(data_size))# make sure we unpacked the right number of valuesassert len(data) == 2 * timecnt + 3 * typecnt + 1transitions = [memorized_datetime(trans)for trans in data[:timecnt]]lindexes = list(data[timecnt:2 * timecnt])ttinfo_raw = data[2 * timecnt:-1]tznames_raw = data[-1]del data# Process ttinfo into separate structsttinfo = []tznames = {}i = 0while i < len(ttinfo_raw):# have we looked up this timezone name yet?tzname_offset = ttinfo_raw[i+2]if tzname_offset not in tznames:nul = tznames_raw.find('0円', tzname_offset)if nul < 0:nul = len(tznames_raw)tznames[tzname_offset] = tznames_raw[tzname_offset:nul]ttinfo.append((ttinfo_raw[i],bool(ttinfo_raw[i+1]),tznames[tzname_offset]))i += 3# Now build the timezone objectif len(transitions) == 0:ttinfo[0][0], ttinfo[0][2]cls = type(zone, (StaticTzInfo,), dict(zone=zone,_utcoffset=memorized_timedelta(ttinfo[0][0]),_tzname=ttinfo[0][2]))else:# Early dates use the first standard time ttinfoi = 0while ttinfo[i][1]:i += 1if ttinfo[i] == ttinfo[lindexes[0]]:transitions[0] = datetime.minelse:transitions.insert(0, datetime.min)lindexes.insert(0, i)# calculate transition infotransition_info = []for i in range(len(transitions)):inf = ttinfo[lindexes[i]]utcoffset = inf[0]if not inf[1]:dst = 0else:for j in range(i-1, -1, -1):prev_inf = ttinfo[lindexes[j]]if not prev_inf[1]:breakdst = inf[0] - prev_inf[0] # dst offsettzname = inf[2]# Round utcoffset and dst to the nearest minute or the# datetime library will complain. Conversions to these timezones# might be up to plus or minus 30 seconds out, but it is# the best we can do.utcoffset = int((utcoffset + 30) / 60) * 60dst = int((dst + 30) / 60) * 60transition_info.append(memorized_ttinfo(utcoffset, dst, tzname))cls = type(zone, (DstTzInfo,), dict(zone=zone,_utc_transition_times=transitions,_transition_info=transition_info))return cls()if __name__ == '__main__':import os.pathfrom pprint import pprintbase = os.path.join(os.path.dirname(__file__), 'zoneinfo')tz = build_tzinfo('Australia/Melbourne',open(os.path.join(base,'Australia','Melbourne'), 'rb'))tz = build_tzinfo('US/Eastern',open(os.path.join(base,'US','Eastern'), 'rb'))pprint(tz._utc_transition_times)#print tz.asPython(4)#print tz.transitions_mapping
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。