GOOGLE ADS

суббота, 30 апреля 2022 г.

Как преобразовать datetime.time из UTC в другой часовой пояс?

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

    Комментариев нет:

    Отправить комментарий

    Laravel Datatable addColumn returns ID of one record only

    Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...