我想了解何时应该使用
datetime.now(tz=pytz.utc).replace(tzinfo=None)
而不是简单地
datetime.utcnow()
后者不会考虑例如夏令时?
答案 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)
。