类tzinfo是抽象基类,不能直接实例化。因此需要创建一个派生类,并且至少实现三个方法,才可以使用。在timezone里已经实现北美的EST和EDT时区的时间。
tzinfo的实例可以传送给datetime对象和time对象,以便指定特定的时区。tzinfo对象主要用来表示与UTC时间差距,以及时区的名称,夏时制的相对时间。
一个派生类应实现下面的方法:
tzinfo.utcoffset(dt)
返回当地时间与UTC时间的差距。如果时区在UTC的西边,应采用负数来表示。这里值得注意的是:当有夏时制时,可以直接在这里把时区时间差和夏时制的时间差加到一起返回来。比如:
return CONSTANT # fixed-offset class
return CONSTANT + self.dst(dt) # daylight-aware class
并且当utcoffset不返回None时,dst()也不应返回None。
tzinfo.dst(dt)
返回夏时制的时间调整差值。如果夏时制没有效,返回timedelta(0)。如果夏时制有效,按utcoffset()格式返回。一般情况下,都是把夏时制的时间差放在utcoffset里一起返回,除非你想区分时区的时间差和夏时制的时间差。例如:
def dst(self, dt):
# a fixed-offset class: doesn‘t account for DST
return timedelta(0)
或者
def dst(self, dt):
# Code to set dston and dstoff to the time zone‘s DST
# transition times based on the input dt.year, and expressed
# in standard local time. Then
if dston <= dt.replace(tzinfo=None) < dstoff:
return timedelta(hours=1)
else:
return timedelta(0)
tzinfo.tzname(dt)
返回时区的名称字符串。返回的格式可以这样:“GMT”, “UTC”, “-500”, “-5:00”, “EDT”, “US/Eastern”, “America/New York”。
上面这三个方法,实现之后都由datetime或time对象进行调用,是最基本的方法,下面学习另外一些方法,不是必须实现的。
蔡军生 QQ:9073204 深圳