为啥 tzinfo 会在 python 中打破创建纪元时间?

Posted

技术标签:

【中文标题】为啥 tzinfo 会在 python 中打破创建纪元时间?【英文标题】:Why does tzinfo break creating an epoch time in python?为什么 tzinfo 会在 python 中打破创建纪元时间? 【发布时间】:2013-10-30 08:29:22 【问题描述】:

为什么会发生以下情况?

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。两者看起来都非常“没有夏令时”。

只是对解决方法不感兴趣。

更新:

在阅读了一些文档 (http://docs.python.org/2/library/time.html#time.mktime) 之后,mktime() 似乎输出“本地时间”而不是我想象的 UTC。这让一切都感到困惑。

【问题讨论】:

你的标题提到了“纪元时间”。这个答案显示how to convert datetime.date and datatime.datetime to POSIX timestamp 【参考方案1】:

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

在它工作的系统上,它将 datetime 对象解释为本地时区的时间,即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() 全年始终为零。

【讨论】:

以上是关于为啥 tzinfo 会在 python 中打破创建纪元时间?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Python 的 datetime.time 有 tzinfo 参数?

Python Django:tzinfo 不适用于数据库插入。但是为啥 .now(local_tz) 有效?

为啥 JS 字符限制会在 Safari 中被打破?

为啥 pytz localize() 不生成一个 tzinfo 与本地化它的 tz 对象匹配的 datetime 对象?

python - 如何在Python中转换为UTC后完全删除tzinfo?

为啥我在 python 中看到时区异常[重复]