何时使用 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.Now 与 DateTime.UtcNow
DateTime.Now 和DateTime.UtcNow的区别
为啥 DateTime.Now 和 DateTime.UtcNow 不是我当前的本地日期时间?
我应该在 HttpCookie.Expires 和 HttpCachePolicy.SetExpires 中使用 DateTime.Now 还是 DateTime.UtcNow?