У меня есть переменная, которая содержит время типа datetime.time в UTC, я хотел, чтобы она была преобразована в какой-то другой часовой пояс.
мы можем преобразовать часовые пояса в экземпляре datetime.datetime, как показано в этой ссылке SO. Как преобразовать местное время в UTC в Python?. Я не могу понять, как конвертировать часовые пояса в экземпляры datetime.time. Я не могу использовать astimezone, потому что datetime.time не имеет этого метода.
Например:
>>> t = d.datetime.now().time()
>>> t
datetime.time(12, 56, 44, 398402)
>>>
Мне нужно 't' в формате UTC.
Решение проблемы
Есть четыре случая:
datetime.time
установлен tzinfo
(например, OP упоминает UTC)tzinfo
не задано)datetime.time
не tzinfo
установленtzinfo
не задано)Правильный ответ должен использовать datetime.datetime.timetz()
функцию, потому что datetime.time
не может быть построен как ненаивная метка времени путем вызова localize()
или astimezone()
напрямую.
from datetime import datetime, time
import pytz
def timetz_to_tz(t, tz_out):
return datetime.combine(datetime.today(), t).astimezone(tz_out).timetz()
def timetz_to_tz_naive(t, tz_out):
return datetime.combine(datetime.today(), t).astimezone(tz_out).time()
def time_to_tz(t, tz_out):
return tz_out.localize(datetime.combine(datetime.today(), t)).timetz()
def time_to_tz_naive(t, tz_in, tz_out):
return tz_in.localize(datetime.combine(datetime.today(), t)).astimezone(tz_out).time()
Пример на основе требования OP:
t = time(12, 56, 44, 398402)
time_to_tz(t, pytz.utc) # assigning tzinfo= directly would not work correctly with other timezones
datetime.time(12, 56, 44, 398402, tzinfo=<UTC>)
В случае, если требуется наивная временная метка:
time_to_tz_naive(t, pytz.utc, pytz.timezone('Europe/Berlin'))
datetime.time(14, 56, 44, 398402)
Случаи, когда экземпляр time() уже tzinfo
установлен, проще, потому что datetime.combine
он выбирает tzinfo
из переданного параметра, поэтому нам просто нужно преобразовать его в tz_out
.
Комментариев нет:
Отправить комментарий