首页 > 解决方案 > 同一时区的python时区问题

问题描述

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

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

标签: python-3.xtimezonepytz

解决方案


问题在于pytz使用与 Python 标准库不同的时区模型这一事实。这是 Paul Ganssle 的博客文章,解释了这个问题。

正确pytz的方法是使用localizetimezone类的方法:

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是时区。replace使用时避免pytz使用,而是使用localize

的替代方案pytzdateutildateutil在这里,由于使用了标准库的时区模型,上述操作更加直接:

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

推荐阅读