我需要当前位置与 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中得到这个?
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
被弃用的部分原因。