【问题标题】:Why the difference between datetime.now(datetime.timezone.utc) and datetime.datetime.utcnow()为什么 datetime.now(datetime.timezone.utc) 和 datetime.datetime.utcnow() 之间的区别
【发布时间】:2021-09-08 01:40:02
【问题描述】:

如果您致电 datetime.datetime.now(datetime.timezone.utc),您会得到类似 datetime.datetime(2021, 9, 8, 1, 33, 19, 684253, tzinfo=datetime.timezone.utc) 的信息。

如果你打电话给datetime.datetime.utcnow(),你会得到类似datetime.datetime(2021, 9, 8, 1, 33, 20, 283212)的东西。

结果看似相同,但实际上并非如此,因为时间戳会有所不同。例如。调用 datetime.datetime.now(datetime.timezone.utc).timestamp() - datetime.datetime.utcnow().timestamp() 返回(对我而言):-18000.000012159348

这是为什么呢?

import datetime

print()
print(datetime.datetime.now(datetime.timezone.utc))
print(datetime.datetime.utcnow())

print()
print(datetime.datetime.now(datetime.timezone.utc).timestamp())
print(datetime.datetime.utcnow().timestamp())
print(datetime.datetime.now(datetime.timezone.utc).timestamp() - datetime.datetime.utcnow().timestamp())

【问题讨论】:

标签: python datetime python-datetime


【解决方案1】:

此行为已记录在案。发生这种情况是因为 utcnow() 返回一个天真的日期时间。

datetime.utcnow()

返回当前 UTC 日期和时间,使用 tzinfo None

这类似于 now(),但返回当前 UTC 日期和时间,作为 天真的日期时间对象。可以获得已知的当前 UTC 日期时间 致电datetime.now(timezone.utc)

这就是为什么文档还提到datetime.now()

此功能优于today()utcnow()

【讨论】:

  • A naive timestamp 是没有时区的时间戳?
  • @étale-cohomology 时间戳并不幼稚,datetime 是。 Docs:“一个简单的对象是否表示协调世界时 (UTC)、当地时间或其他时区的时间完全取决于程序,就像特定数字是否表示米、英里或质量一样取决于程序. 幼稚的对象很容易理解和使用,但代价是忽略了现实的某些方面。”有些人认为幼稚的日期时间是一个基本的设计缺陷。
【解决方案2】:

utcnow 创建一个简单的 datetime 实例,因为它在 Python 中引入时没有 UTC 时区对象。来自timestamp() 的文档:

假定原始日期时间实例表示本地时间,并且此方法依赖于平台 C 的 mktime() 函数来执行转换。

【讨论】:

    猜你喜欢
    • 2018-09-23
    • 2018-02-11
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    • 2018-07-18
    相关资源
    最近更新 更多