同一时区的python时区问题

rhfm7lfc  于 2022-12-30  发布在  Python
关注(0)|答案(1)|浏览(132)

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

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
2vuwiymt

2vuwiymt1#

问题在于pytz使用的时区模型与解释该问题的Python标准lib.Here's a blog post by Paul Ganssle不同。
pytz执行此操作的正确方法是使用其timezone类的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使用标准lib的时区模型,因此上面的操作更加直接:

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

相关问题