何时使用 datetime.utcnow() 或 datetime.now(tz=pytz.utc).replace(tzinfo=None)

Posted

技术标签:

【中文标题】何时使用 datetime.utcnow() 或 datetime.now(tz=pytz.utc).replace(tzinfo=None)【英文标题】:When to use datetime.utcnow() or datetime.now(tz=pytz.utc).replace(tzinfo=None) 【发布时间】:2017-07-14 23:06:20 【问题描述】:

我想知道什么时候应该使用

datetime.now(tz=pytz.utc).replace(tzinfo=None)

而不是简单地

datetime.utcnow()

后者是否不考虑例如?夏令时?

【问题讨论】:

【参考方案1】:

datetime.datetime 的工作方式很大程度上取决于运行它的机器。主机的本地时间和时区设置将决定您将获得的输出。

如果主机在 UTC 时区,那么 datetime.datetime.now()datetime.datetime.utcnow() 之间没有区别。

根据pytz documentation:

处理时间的首选方式是始终以 UTC 工作,仅在生成供人类阅读的输出时转换为本地时间。

pytz 用于计算夏令时,datetime.datetime.utcnow() 用于提供一个通用的标准化参考点,您可以在该参考点上计算夏令时。 datetime.datetime.utcnow() 本身不会考虑夏令时。

【讨论】:

【参考方案2】:

你永远不应该使用datetime.utcnow(),因为它会给你一个幼稚的时间戳,你可以用它来打自己的脚。如果您真的想要一个简单的时间戳,请使用您的第一个选项使其明确。 now() 采用 tz 参数(您应该始终提供该参数,以避免使用主机 TZ)。但是utcnow() 显然没有提供。所以它注定了。

例如,假设您有一个 UTC 时间戳,并且您想将其转换为墨西哥城的当地时间:

my_timestamp.astimezone(pytz.timezone("America/Mexico_City"))

看起来不错,对吧?不,看看这个:

>>> datetime.utcnow()
datetime.datetime(2021, 3, 29, 21, 40, 44, 329559)
>>> datetime.utcnow().astimezone(pytz.timezone("America/Mexico_City"))
datetime.datetime(2021, 3, 29, 21, 40, 44, 329559, tzinfo=<DstTzInfo 'America/Mexico_City' CST-1 day, 18:00:00 STD>)

如您所见,astimezone 如果您给它一个简单的时间戳,它只会添加 tz,而不会按预期调整实际时间。 (如果你不想调整,你会使用.replace

这非常令人困惑,如果你只是确保你没有幼稚的时间戳,你就不会遇到这样的问题。如果您愿意,您可以将它们放在您的外部 API 中,但在它们进入系统时添加一个时区。

总结:始终使用datetime.now(tz=some_tz)

【讨论】:

以上是关于何时使用 datetime.utcnow() 或 datetime.now(tz=pytz.utc).replace(tzinfo=None)的主要内容,如果未能解决你的问题,请参考以下文章

请谨慎使用 datetime.utcnow()

DateTime.Now 与 DateTime.UtcNow

DateTime.Now 和DateTime.UtcNow的区别

为啥 DateTime.Now 和 DateTime.UtcNow 不是我当前的本地日期时间?

我应该在 HttpCookie.Expires 和 HttpCachePolicy.SetExpires 中使用 DateTime.Now 还是 DateTime.UtcNow?

Python datetime utcnow vs Luxon Datetime.fromMillis?