Python 如何将datetime.time从UTC转换为不同的时区?

Python 如何将datetime.time从UTC转换为不同的时区?,python,datetime,timezone,Python,Datetime,Timezone,我有一个变量,它保存的时间是UTC中的datetime.time类型,我希望它转换成其他时区 我们可以在datetime.datetime实例中转换时区,如本SO链接-。我不知道如何在datetime.time实例中转换时区。我无法使用astimezone,因为datetime.time没有此方法 例如: >>> t = d.datetime.now().time() >>> t datetime.time(12, 56, 44, 398402) >&g

我有一个变量,它保存的时间是UTC中的datetime.time类型,我希望它转换成其他时区

我们可以在datetime.datetime实例中转换时区,如本SO链接-。我不知道如何在datetime.time实例中转换时区。我无法使用astimezone,因为datetime.time没有此方法

例如:

>>> t = d.datetime.now().time()
>>> t
datetime.time(12, 56, 44, 398402)
>>> 

我需要UTC格式的“t”

我将创建一个temp datetime对象,转换tz,然后再次提取时间

import datetime
def time_to_utc(t):
    dt = datetime.datetime.combine(datetime.date.today(), t)
    utc_dt = datetime_to_utc(dt)
    return utc_dt.time()

t = datetime.datetime.now().time()
utc_t = time_to_utc(t)

其中,
datetime\u to_utc
是中的任何建议。

使用以下方法从utc时区转换为utc时区的简便方法:

有四种情况:

  • 输入
    datetime.time
    设置了
    tzinfo
    时间(例如OP提到UTC)
  • 输出为非原始时间
  • 输出为初始时间(
    tzinfo
    未设置)
  • 输入
    datetime.time
    具有
    tzinfo
    未设置
  • 输出为非原始时间
  • 输出为初始时间(
    tzinfo
    未设置)
  • 正确的答案需要使用
    datetime.datetime.timetz()
    函数,因为通过直接调用
    localize()
    astimezone()
    无法将
    datetime.time
    构建为非原始时间戳

    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()实例已经设置了
    tzinfo
    的情况更容易,因为
    datetime.combine
    从传递的参数中拾取
    tzinfo
    ,所以我们只需要转换为
    tzinfo-out

    好,是否不可能使用datetime.time实例转换时区。谷歌搜索它什么也没找到。你的方法很好,但花的时间太多了。还有更好的办法吗?谢谢。您可能需要解释您的代码,并且naive应该是本地的,就像您的本地时区一样???其中,
    naive
    是一个没有时区的
    datetime
    对象,
    timezone
    是一个与
    pytz.timezone
    名称之一匹配的字符串。简要说明naive与aware
    datetime
    对象。
    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)