很确定这是一件容易的事,但我不明白。
我当地的 TZ 目前是 GMT+3,当我从datetime.utcnow().timestamp()
这确实比我少了3个小时datetime.now().timestamp()
在我的流程中的另一个过程中,我采用 utc 时间戳并需要将其转换为日期时间。
当我在做的时候fromtimestamp
我得到了正确的 UTC 时间,但是当我使用时utcfromtimestamp
我又得到了 3 小时的补偿。
不过,文档要求我使用fromtimestamp
对于本地时区,以及utcfromtimestamp
对于 utc 用法。
我缺少什么?这两个函数的初始假设是时间戳是在本地时区中给出的吗?
谢谢 :)
同时使用 datetime 对象及其 POSIX 时间戳(Unix 时间)时要注意的关键一点是,Python 假定原始 datetime 对象(没有时区信息的对象)引用本地时间(操作系统设置)。相反,POSIX 时间戳(应该)始终引用自纪元 UTC 以来的秒数。您可以明确地获得这一点,例如从time.time()。在您的示例中,发生了不太明显的事情:
-
datetime.now().timestamp()
- now() 为您提供一个类似于本地时间的简单日期时间对象。如果调用 timestamp(),Python 会将日期时间转换为 UTC 并计算时间戳。
-
datetime.utcnow().timestamp()
- utcnow() 为您提供一个类似于 UTC 的简单日期时间对象。但是,如果您调用 timestamp(),Python 会假设(因为天真)日期时间是本地时间 - 并在计算时间戳之前再次转换为 UTC!因此,生成的时间戳与 UTC 的偏差是本地时间 UTC 偏移量的两倍。
代码示例。让我们制作一些时间戳。请注意,我使用的是 UTC+2 (CEST),因此偏移量为 -7200 秒。
import time
from datetime import datetime, timezone
ts_ref = time.time() # reference POSIX timestamp
ts_utcnow = datetime.utcnow().timestamp() # dt obj UTC but naive - so also assumed local
ts_now = datetime.now().timestamp() # dt obj naive, assumed local
ts_loc_utc = datetime.now(tz=timezone.utc).timestamp() # dt obj localized to UTC
print(int(ts_utcnow - ts_ref))
# -7200 # -> ts_utcnow doesn't refer to UTC!
print(int(ts_now - ts_ref))
# 0 # -> correct
print(int(ts_loc_utc - ts_ref))
# 0 # -> correct
我希望这能澄清如果你打电话datetime.utcfromtimestamp(ts_utcnow)
,您将获得本地时间 UTC 偏移量的两倍。 Python 假设(我认为这是相当理智的)时间戳指的是 UTC - 事实上,它不是。
我的建议是使用时区感知的日期时间对象;喜欢datetime.now(tz=timezone.utc)
。如果您使用时区,dateutil库或 Python 3.9 的zoneinfo模块非常有帮助。如果您想深入挖掘,请查看日期时间源代码.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)