提问人:ullix 提问时间:11/3/2023 最后编辑:ullix 更新时间:11/21/2023 访问量:165
现在 utcnow() 已弃用,您如何在 Python 中获取 UTC 时间偏移量?[复制]
How do you get the UTC time offset in Python now that utcnow() is deprecated? [duplicate]
问:
我需要当前位置和 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 中实现这一点?
没有一个答案和评论能提供这个问题的答案。
编辑2
我找到了 2 种可能的解决方法:
import datetime as dt
# workaround #1
ts = time.time()
utc = dt.datetime.fromtimestamp(ts, tz=datetime.timezone.utc) # 2023-11-06 11:49:30.154083+00:00
local = dt.datetime.fromtimestamp(ts, tz=None) # 2023-11-06 12:49:30.154083
ts_utc = dt.datetime.strptime(str(utc) [0:19], "%Y-%m-%d %H:%M:%S").timestamp() # 1699267770.0
ts_local = dt.datetime.strptime(str(local)[0:19], "%Y-%m-%d %H:%M:%S").timestamp() # 1699271370.0 # more by 3600 sec
TimeZoneOffset = ts_local - ts_utc # +3600 (sec)
# workaround #2
TimeZoneOffset = dt.datetime.now().astimezone().utcoffset().total_seconds() # +3600 (sec)
答:
unix 时间戳是自 1970 年 1 月 1 日 00:00:00 UTC 以来的秒数。它是一个全局值,而不是局部值,这就是它的用处。
问题实际上出在.要么你的原始示例代码答案颠倒了,要么你位于格林威治以东,你的时区早于 UTC,你实际上应该期待一个更小的时间戳。对我来说,我比 UTC 时间晚 4 小时(即格里维奇以西)。utcnow
utcnow
>>> datetime.datetime.utcnow().timestamp()
1699038850.622385
>>> datetime.datetime.now().timestamp()
1699024453.862131
>>>
所以,对我来说,utcnow时间戳更大。问题在于生成一个没有嵌入时区信息的对象。因此,当您调用 timestamp 时,您将获得本地时间是现在的 UTC 时间的时间戳。datetime.datetime.utcnow()
datetime.datetime
我希望这是弃用的部分原因。utcnow
评论
datetime.datetime.utcfromtimestamp(now.timestamp()).timestamp()
datetime.datetime.utcnow().timestamp(): 1699017779.016835
- 这就是该方法首先被弃用的原因。它具有误导性和容易出错,因为从 utcnow() 返回的日期时间的结果不是 Unix 时间。