python同一个时区的时区问题

python timezone problem with the same timezone

为什么我在一个日期时间结构几乎相同的文件中得到不同的结果时区?

print(datetime.datetime.now(pytz.timezone('Europe/Moscow')))
>>> 2020-05-31 12:55:04.778210+03:00

print(datetime.datetime(2020, 5, 31, 12, 54, 0, 0,  pytz.timezone('Europe/Moscow')))
>>> 2020-05-31 12:54:00+02:30

问题在于 pytz 使用与 Python 标准库不同的时区模型。 Here's a blog post by Paul Ganssle 解释问题。

使用 pytz 执行此操作的正确方法是使用其 timezone class:

localize 方法
import datetime
import pytz
print(datetime.datetime.now(pytz.timezone('Europe/Moscow')))
>>> 2020-05-31 15:15:45.559007+03:00

print(pytz.timezone('Europe/Moscow').localize(datetime.datetime(2020, 5, 31, 15, 16, 0, 0)))
>>> 2020-05-31 15:16:00+03:00

虽然 datetime.datetime.now(pytz.timezone('Europe/Moscow')) 使用定义的时区正确创建了一个 datetime 对象,但 datetime.datetime(2020, 5, 31, 12, 54, 0, 0, pytz.timezone('Europe/Moscow')) 首先创建了一个天真的 datetime 对象,然后 replace 时区。在使用 pytz 时避免使用 replace,而是使用 localize

pytz 的替代方法是 dateutil。在这里,由于 dateutil 使用标准库的时区模型,上述操作更加直接:

import dateutil

print(datetime.datetime.now(dateutil.tz.gettz('Europe/Moscow')))
>>> 2020-05-31 15:13:55.967773+03:00

print(datetime.datetime(2020, 5, 31, 15, 14, 0, 0,  dateutil.tz.gettz('Europe/Moscow')))
>>> 2020-05-31 15:14:00+03:00