Ответ 1
Изменить: Расхождение, обсуждаемое ниже, больше не существует при использовании
>>> dateutil.__version__
'1.5'
>>> pytz.__version__
'2012c'
Модуль pytz предупреждает,
эта библиотека отличается от документированного API Python для tzinfo реализации; если вы хотите создать локальные часы для использования метода localize()
и далее
Эта библиотека поддерживает только два способа построения локализованного времени. сначала следует использовать метод localize(), предоставляемый библиотекой pytz.
In [61]: u4 = pytz.timezone('America/Chicago')
In [62]: print(u4.localize(datetime.datetime(2010, 5, 2, 11, 10)))
2010-05-02 11:10:00-05:00
Другим способом является использование метода astimezone
, который используется для преобразования даты и времени, зависящего от часового пояса, в другое время и время, относящиеся к часовому поясу.
И чтобы быть полностью явным, предупреждает против о создании дат-времени, учитывающего часовой пояс, с использованием аргумента tzinfo
:
К сожалению, использование аргумента tzinfo стандартного времени datetime конструкторы 'не работают с pytz для многих часовых поясов.
Пусть проверяется гипотеза о том, что
datetime.datetime(year, month, day, hour, minute, tzinfo = dateutil_tz)
равно
pytz_tz.localize(datetime.datetime(year, month, day, hour, minute))
с помощью этого кода:
import dateutil.tz
import datetime
import pytz
now = datetime.datetime.now()
for name in pytz.all_timezones:
dateutil_tz = dateutil.tz.gettz(name)
pytz_tz = pytz.timezone(name)
dateutil_date = datetime.datetime(
now.year, now.month, now.day, now.hour, now.minute, tzinfo = dateutil_tz)
pytz_date = pytz_tz.localize(datetime.datetime(
now.year, now.month, now.day, now.hour, now.minute))
try:
assert dateutil_date.isoformat() == pytz_date.isoformat()
except AssertionError:
print(name)
print(dateutil_date.isoformat())
print(pytz_date.isoformat())
Код дает:
America/Argentina/San_Luis
2012-12-18T22:32:00-04:00 <-- dateutil datetime
2012-12-18T22:32:00-03:00 <-- pytz datetime
Итак, моя гипотеза была неправильной: dateutil и pytz возвращают разные результаты.
Итак, какой из них правильный? Я не уверен, но согласно этот сайт, в настоящее время
America/Argentina/San_Luis time zone offset is:
UTC / GMT -03:00 hours
значит, pytz верен.