У меня есть переменная, которая содержит время типа 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.
Комментариев нет:
Отправить комментарий