现在 utcnow() 已被弃用,如何在 Python 中获取 UTC 时间偏移量? [重复]

问题描述 投票:0回答:1

我需要当前位置与 UTC 之间的时差(以秒为单位)。它与(例如柏林时区,UTC+1h)配合得很好:

import datetime
datetime.datetime.utcnow().timestamp(): 1699017779.016835
datetime.datetime.now().timestamp():    1699021379.017343 # 3600 sec larger, correct!

但是现在

utcnow()
被标记为已弃用,我需要
now()
并使用时区对象加载它:

datetime.datetime.now(datetime.timezone.utc): 2023-11-03 14:22:59.018573+00:00
datetime.datetime.now():                      2023-11-03 15:22:59.018941    # 1 h later, correct!

也给出正确的结果。但由于我想要时间戳,我像以前一样,但得到了错误的结果:

datetime.datetime.now(datetime.timezone.utc).timestamp()) 1699021379.019286 # UTC  : is actually local timestamp
datetime.datetime.now().timestamp())                      1699021379.019619 # Local: why no difference ???

Local 是正确的,但 UTC 现在给出与 Local 完全相同的时间戳,这是错误的!我错过了什么还是这只是一个错误?

编辑:

在查看了所有评论后,我不同意一些评论者的观点 - 我认为 utcnow() 没有任何问题。它确实给出了调用时的 UTC 时间戳。当然,当您询问 UTC 时间时,不涉及时区!似乎错误的是对其他地方使用时间戳,其中包括与 UTC 的时差,并将其视为 UTC/UNIX 时间戳?

但也许我应该更清楚地表达我的需求:我想要我的时区和 UTC 之间的时差(以秒为单位)。有没有更简单的方法在Python中得到这个?

python datetime unix-timestamp
1个回答
3
投票

unix 时间戳是自 UTC 1970 年 1 月 1 日 00:00:00 起的秒数。它是一个全局值而不是局部值,这就是它的有用之处。

问题实际上出在

utcnow
。要么您的原始示例代码答案颠倒,要么您位于格林威治东部,您的时区早于 UTC,并且您实际上应该期待
utcnow
的更小的时间戳。对我来说,我比 UTC 时间晚 4 小时(即格林威治以西)。

>>> datetime.datetime.utcnow().timestamp()
1699038850.622385
>>> datetime.datetime.now().timestamp()
1699024453.862131
>>> 

所以,对我来说 utcnow 时间戳更大。问题是

datetime.datetime.utcnow()
生成一个没有嵌入时区信息的
datetime.datetime
对象。因此,当您对其调用时间戳时,您会得到本地时间与现在 UTC 时间的时间戳。

我希望这就是

utcnow
被弃用的部分原因。

© www.soinside.com 2019 - 2024. All rights reserved.