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
为什么我在一个日期时间结构几乎相同的文件中得到不同的结果时区?
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