2007-08-15

 

Python Cookbook 3.9 转换时区

需求:

假如你现在在西班牙,你需要知道中国发生的事件的西班牙时间.

讨论:

对于datetime对时区的支持,可以从第三方包dateutil获得,这里有一个方法来设置本地时区,并打印出时间来看它是否有效:

from dateutil import tz 
import datetime
posixstr = "CET-1CEST-2,M3.5.0/02:00, M10.5.0/03:00"
spaintz = tz.tzstr(posixstr)
print datetime.datetime.now(spaintz).ctime( )

在不同时区中转换也是可以的,而且在生活中可能经常遇到.比如,让我们找出下一界奥林匹克运动会开幕的时间,以西班牙时间为准:

chinatz = tz.tzoffset("China", 60*60*8)
olympicgames = datetime.datetime(2008, 8, 8, 20, 0, tzinfo=chinatz)
print olympicgames.astimezone(spaintz)

前面使用的那个神秘的posixstr是一种使用OPSIX方式来表示时区的字符串,现在在西班牙使用.这个字符串提供了标准和夏令时时区(CST,CEST)的名称,他们的偏移量(UTC+1,UTC+2),以及夏令时开始和结束的时间(3月最后一个周日的早上2点,8月的最后一个周日早上3点).我们可以判断DST时区来保证它们正确:

assert spaintz.tzname(datetime.datetime(2004, 03, 28, 1, 59)) == "CET"
assert spaintz.tzname(datetime.datetime(2004, 03, 28, 2, 00)) == "CEST"
assert spaintz.tzname(datetime.datetime(2004, 10, 31, 1, 59)) == "CEST"
assert spaintz.tzname(datetime.datetime(2004, 10, 31, 2, 00)) == "CET"

这上面的assert都应该能通过.
注意到尽管回到标准时间是早上3点,可是上面还是按照2点来写,是因为2点和3点的时间差, 是很模糊的.那个2点重复了2次:一次是标准时间,一次夏令时.就当前来说,使用Python的datetime不能区分二者,所以建议你保存UTC时间实例,来进行时区转换.
为了在中国和西班牙间进行时区转换,我们使用tzoffset来表示中国时间比UTC早8个小时,注意datetime对象是怎样被建立的,即使是本地时间,也要作这样的转换.如果你没有使用时区信息来创建datetime对象,你将会获得异常:ValueError: astimezone( ) cannot be applied to a naive datetime. datetime对象在创立的时候,总是默认没有时区信息,除非你显式的给出时区信息.为此 ,dateutil提供了tzlocal类型,它用来表示本地时区的时间.
除了目前我们所看到的类型外,dateutil也提供tzutc,它用于创建UTC时间对象.tzfile,它允许使用标准时间二进制文件.tzical,它用于创建iCalender时区对象.当然,还有很多别的类型.

标签:


Comments: 发表评论



<< Home

This page is powered by Blogger. Isn't yours?