为什么tzinfo打破了在python中创建一个纪元时间?

时间:2013-10-21 17:55:11

标签: python datetime utc epoch pytz

为什么会发生以下情况?

from datetime import datetime
import pytz

d = pytz.utc.localize(datetime.utcnow())
print float(d.strftime('%s')) - float(d.replace(tzinfo=None).strftime('%s')) # 3600.0

为什么是否包含tzinfo一小时?我假设它与DST有关,但...... UTC没有DST。

d.timetuple()
# time.struct_time(tm_year=2013, tm_mon=10, tm_mday=21, tm_hour=17, tm_min=44, tm_sec=40, tm_wday=0, tm_yday=294, tm_isdst=0)
d.replace(tzinfo=None).timetuple()
# time.struct_time(tm_year=2013, tm_mon=10, tm_mday=21, tm_hour=17, tm_min=44, tm_sec=40, tm_wday=0, tm_yday=294, tm_isdst=-1)

因此,差异为tm_isdst0-1。两者似乎都非常“没有DST-ish”。

对解决方法感到兴奋。

更新

阅读了一些文档(http://docs.python.org/2/library/time.html#time.mktime)后,mktime()输出“localtime”而非UTC,正如我所想的那样。这让一切都搞不清楚。

1 个答案:

答案 0 :(得分:0)

.strftime('%s') is not supported by Python。不要使用它。

在有效的系统上,它将日期时间对象解释为本地时区的时间,即datetime.now().strftime('%s')可能会在time.time()附近返回值。

要查找utc偏移量或DST是否在给定的当地时间生效,您可以致电d.utcoffset()d.dst()其中d是具有pytz时区的日期时间对象。

>>> import pytz
>>> d = datetime.now(pytz.utc)
>>> d.utcoffset()
datetime.timedelta(0)
>>> d.dst()
datetime.timedelta(0)

正如预期的那样,UTC时区的UTC偏移为零,并且没有DST转换,因此.dst()全年始终为零。