我认为有可能存在陷阱,但忽略了已知的问题案例,只考虑其他常见的时间价值,是否有人写过函数在澳大利亚的不同州(忽略外部地区)进行澳大利亚时区转换?
我知道有pytz,但该模块在这种环境下不可用,并且设置它不是一项简单的任务。
以下是我根据维基百科规范起草的代码。
# Return converted time from one Australia state timezone to another
# Assumes DST regime is post 12 April 2007 when 5 states agreed to common DST start and end day
# argument tm is a datetime/date
# accuracy benchmark vs pytz shows 5 in 100,000 discrepancy in converting random datetime values in borderline dst cases
def au_tz_convert(fromState, toState, tm):
tz = {
'WA' : +8
,'NT' : +9.5
,'QLD': +10
,'SA' : +9.5
,'NSW': +10
,'VIC': +10
,'ACT': +10
,'TAS': +10
}
if not(fromState in tz and toState in tz):
raise Exception, "input state values should be in " + str(tz.keys())
a = tz[fromState]
b = tz[toState]
from datetime import timedelta, datetime
def dst(auState, tm):
if auState in ['WA','NT','QLD']:
return 0
#DST start is first Sunday in October
#DST end is first Sunday in April
dst_start = datetime(tm.year,10,1, 2)
dst_end = datetime(tm.year, 4,1, 2)
while dst_start.weekday() != 6:
dst_start += timedelta( days=1 )
while dst_end.weekday() != 6:
dst_end += timedelta( days=1 )
if tm < dst_end or tm >= dst_start:
return 1
return 0
f = dst(fromState, tm)
t = dst(toState , tm)
return tm + timedelta( hours = b-a + t-f )