【问题标题】:Python: UTC vs local timestampPython:UTC与本地时间戳
【发布时间】:2020-07-11 08:35:06
【问题描述】:

为什么以下返回不同的时间戳?是因为 datetime.utcnow() 没有时区吗?在我看来, tzinfo=utc 是多余的,所以我可能不知道 utcnow() 是什么以及 UTC 数字如何没有时区。我想是有原因的,所以请启发我:)

from datetime import datetime
from pytz import utc

local_seconds = int(datetime.utcnow().timestamp())
utc_seconds = int(datetime.utcnow().replace(tzinfo=utc).timestamp())

我的目标是获取 UTC 时间戳。看起来第一种方法返回本地时间戳(如果我错了,请纠正我)

编辑: 我住的时区是 GMT-5。事实上:

(utc_seconds-local_seconds)/3600 # is equal to -5.0

【问题讨论】:

  • 你能分享更大的问题吗? pytz 是一个非默认库,也许您可​​以通过其他方式解决您的问题

标签: python timestamp timezone local utc


【解决方案1】:

遵循两条语句总是会返回不同的结果。

local_seconds = int(datetime.utcnow().timestamp())
utc_seconds = int(datetime.utcnow().replace(tzinfo=utc).timestamp())

输出:

1585584790
1585604590

你问为什么?因为,在第一个语句执行时,执行过程中会花费一些时间,现在第二个语句将获取不同的结果,因为第二个语句的 datetime.utcnow() 已更改。

我的假设是,您想看看这两个操作是否会给出相同的结果?他们肯定会给出相同的结果:

  1. 您是否向他们提供了相同的输入?
  2. 您是否从一个通用库执行了类似的操作。

解决 1. 像这样更改代码。

same_time_input = datetime.utcnow()

local_seconds = int(same_time_input.timestamp())
utc_seconds = int(same_time_input.replace(tzinfo=utc).timestamp())

输出仍然不一样,因为您使用的是外部库,并且替换功能没有按预期工作。

如果您从same_time_input 打印出 tzinfo,您会看到它没有任何时区信息原因,可以在此处阅读。 --> Why does datetime.datetime.utcnow() not contain timezone information?

print(same_time_input.tzinfo)

现在,您正在尝试使用单独的库为其提供时区信息,该库在内部具有不同的实现,从而导致 slightly off 结果。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2019-08-15
  • 2016-10-22
  • 2014-12-30
  • 2017-07-04
  • 2019-03-09
  • 1970-01-01
  • 2017-06-21
  • 2017-06-15
相关资源
最近更新 更多