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

时间:2017-02-24 07:40:25

标签: python datetime timezone pytz

我想了解何时应该使用

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

而不是简单地

datetime.utcnow()

后者不会考虑例如夏令时?

1 个答案:

答案 0 :(得分: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)