Из документации Pytz :
Эта библиотека отличается от документированного Python API для реализаций tzinfo; если вы хотите создать локальное время настенных часов, вам нужно использовать метод localize()
, описанный в этом документе. Кроме того, если вы выполните арифметику даты c по местному времени, которое пересекает границы летнего времени, результат может быть в неправильном часовом поясе (ie. Вычтите 1 минуту из 2002-10-27 в 1:00 по восточному поясному времени, и вы получите 2002- 10-27 0:59 EST вместо правильного 2002-10-27 1:59 ПО ВОСТОЧНОМУ ВРЕМЕНИ).
Итак, вы используете pytz неправильно.
Следующий код является правильным и ошибочным Следующий код показывает результаты вашего использования pytz (datetime.replace(tzinfo=pytz.timezone)
) и рекомендуемый способ использования pytz с datetime (pytz.timezone.localize(datetime)
).
from datetime import datetime, date, time, timezone
from dateutil import tz
import pytz
d = date(2019, 1, 27)
t = time(19, 32, 00)
t1 = datetime.combine(d, t)
t1_epoch = t1.timestamp()
print("t1_epoch " + str(t1_epoch))
print("t1 " + str(t1))
# your approach/code
nytz = pytz.timezone('America/New_York')
t3 = t1.replace(tzinfo=nytz)
t3_epoch = t3.timestamp()
print("t3_epoch " + str(t3_epoch))
print("t3 " + str(t3))
# recommended approach/code using localize
nytz = pytz.timezone('America/New_York')
t6 = nytz.localize(t1)
t6_epoch = t6.timestamp()
print("t6_epoch " + str(t6_epoch))
print("t6 " + str(t6))
Вывод вышеприведенного кода:
t1_epoch 1548617520.0
t1 2019-01-27 19:32:00
t3_epoch 1548635280.0
t3 2019-01-27 19:32:00-04:56
t6_epoch 1548635520.0
t6 2019-01-27 19:32:00-05:00
t3
- это то, что вы делаете, и это дает неправильное смещение (-4: 56). Обратите внимание, что время POSIX также неверно в этом случае. Время POSIX, по определению, не изменяется с часовым поясом.
t6
было создано с использованием метода pytz.timezone.localize()
и дает правильное смещение UT C (-5: 00).
Обновление : обновлен язык ответа: один пользователь нашел ответ, сбивающий с толку .