Преобразование часового пояса Python добавляет минуты к часу? - PullRequest
0 голосов
/ 17 января 2019

Поэтому я пытаюсь преобразовать несколько часов (10:00:00, 14:00:00 и т. Д.) Из заданного часового пояса в UTC.

Когда я так поступаю, я продолжаю безумно возвращаться к вещам вроде «15:51:00».

Когда вы добираетесь до этой строки и печатаете, какое значение оно использует, оно использует что-то вроде:

1900-01-01 12:00:00-05:51

Что нормально, за исключением -05: 51 бит. Я понятия не имею, почему это -05: 51, и это вызывает у меня проблемы. UTC конвертируется час в час, да? Я думаю, это как-то связано с моими конверсиями часовых поясов, но я действительно не понимаю, почему они так поступили.

Вот минимальный пример, который имеет тот же ошибочный вывод; он возвращает 15:51:00, когда должен возвращать ровный час, без минут.

import datetime
from dateutil import tz

jj = datetime.datetime.strptime("10:00:00", "%H:%M:%S")

tzz = tz.gettz('US/Central')

def constructstring(tzz,x):
    inter2 = x.replace(tzinfo=tzz) #ERROR HAPPENS HERE (I'm pretty sure anyways)
    inter3 = inter2.astimezone(tz.tzutc())
    return inter3

print(constructstring(tzz,jj).strftime("%H:%M:%S"))

1 Ответ

0 голосов
/ 17 января 2019

Вы не указываете дату при создании объекта jj datetime, поэтому используется дата по умолчанию 1900-01-01. Часовые пояса не являются фиксированными объектами; они меняются с течением времени, и часовой пояс США / Центральной зоны использовал другое смещение еще в 1900 году.

Как минимум, используйте недавнюю дату, например сегодня , например:

# use today's date, with the time from jj, and a given timezone.
datetime.datetime.combine(datetime.date.today(), jj.time(), tzinfo=tzz)

Если все, что вам нужно, это время , то не создавайте datetime объекты для их хранения; модуль datetime имеет выделенный объект time(). Я бы также не использовал strftime() для создания объектов из литералов. Просто используйте конструктор для передачи целых чисел:

jj = datetime.time(10, 0, 0)  # or just .time(10)

Другие хорошие эмпирические правила: если вам приходится иметь дело с датами с часовыми поясами, попробуйте переместить их в datetime объекты в UTC в тот момент, когда ваш код получает или загружает их. Если у вас есть только время суток, но вам все еще нужна поддержка часового пояса, прикрепите их к сегодняшней дате, чтобы вы получили правильный часовой пояс. Снова конвертируйте в строки как можно позже.

...