【问题标题】:why datetime.now() and datetime.utcnow() return different timestamp为什么 datetime.now() 和 datetime.utcnow() 返回不同的时间戳
【发布时间】:2020-09-12 07:46:23
【问题描述】:

我正在使用 datetime 并发现很难理解 timestamp() 的工作原理,我(在东海岸)想将 datetime 转换为时间戳,但我发现了以下差异。任何人都可以阐明这两个代码是如何工作的,他们是否应该采取不同的行动(大约相差四个小时)?

import datetime
datetime.datetime.utcnow().timestamp()
#1590436949.187297
datetime.datetime.now(tz=datetime.timezone.utc).timestamp()
#1590422553.042119

【问题讨论】:

标签: python datetime timestamp utc


【解决方案1】:

timestamp() 方法返回自纪元 (1970-01-01) 以来的 POSIX 时间戳/秒,该时间戳始终引用 UTC。

问题:如果你在一个简单的 datetime 对象上调用 timestamp() 方法,Python 将假定 datetime 对象持有 当地时间.

虽然datetime.datetime.utcnow() 中的utcnow() 可能暗示其他情况,但它为您提供了一个幼稚的日期时间对象。也就是说,它不“知道”它是 UTC。因此,如果您调用timestamp() 方法,Python 假定传递给函数的 datetime 对象是本地时间并以此计算时间戳。这不是你从time.time() 得到的。

另一方面,在datetime.datetime.now(tz=datetime.timezone.utc).timestamp() 中,您将一个可识别时区的日期时间对象传递给timestamp()。这是正确的,因为它给了你time.time()

插图:

import datetime
import time
import dateutil
localtzname = time.tzname[time.daylight]

# naive:
dt_now = datetime.datetime.now()
# timezone-aware:
dt_now_loc = datetime.datetime.now(dateutil.tz.gettz(localtzname))
dt_now_utc = datetime.datetime.now(tz=datetime.timezone.utc)
# reference:
ts = time.time()

print(dt_now.timestamp())
# 1590424623.226529

print(dt_now_loc.timestamp())
# 1590424623.226529

print(dt_now_utc.timestamp())
# 1590424623.226529

print(ts)
# 1590424623.2265291

如您所见,即使 dt_now 是幼稚的,Python 返回的时间戳与您从本地化的 dt_now_loctime.time() 获得的时间戳相同。

总而言之,datetime.datetime.utcnow().timestamp() 可能会产生很大的误导性,我建议避免使用它。

【讨论】:

  • 感谢您的回复。事情是我想将所有时间格式(可能是幼稚的或使用 tzinfo 取决于来源)转换为无时区的 UTC 时间,所以无论如何都不会混淆,这就是我使用 utcnow() 的原因开始。
  • @xappppp:如果你问我,如果你想避免混淆,请使用带有 tzinfo 集(tz 感知)的 datetime 对象(因为 Python 会将 naive 视为本地)。或者坚持使用像 POSIX 这样总是引用 UTC 的时间戳。
猜你喜欢
  • 2018-06-03
  • 2015-06-20
  • 1970-01-01
  • 2018-02-11
  • 2011-05-03
  • 2010-09-08
  • 2018-03-10
  • 2010-12-13
  • 1970-01-01
相关资源
最近更新 更多