Python (дата / время) преобразование часового пояса отключено на 4 минуты - PullRequest
2 голосов
/ 02 апреля 2020

когда я запускаю этот код:

#!/usr/bin/env python3
from datetime import datetime, timedelta
from dateutil import tz
from pytz import timezone

time = "2020-01-15 10:14:00"
time = datetime.strptime(time, "%Y-%m-%d %H:%M:%S")

print("time1 = " + str(time))

time = time.replace(tzinfo=timezone('America/New_York'))
print("time2 = " + str(time))

time = time.astimezone(tz.gettz('UTC')) # explicity convert to UTC time
print("time3 = " + str(time))

time = datetime.strftime(time, "%Y-%m-%d %H:%M:%S")  # output format
print("done time4 = " + str(time))

Я получаю этот вывод:

time1 = 2020-01-15 10:14:00
time2 = 2020-01-15 10:14:00-04:56
time3 = 2020-01-15 15:10:00+00:00
done time4 = 2020-01-15 15:10:00

Я бы ожидал, что окончательное время будет "2020-01-15 15:14 : 00 "У кого-нибудь есть идеи, почему это на 4 минуты? Я не понимаю, почему смещение по времени2 будет равно "-04: 56" вместо "-05: 00"

1 Ответ

1 голос
/ 02 апреля 2020

Из документации 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).

Обновление : обновлен язык ответа: один пользователь нашел ответ, сбивающий с толку .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...