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

时间:2013-05-17 07:24:29

标签: python datetime timezone

我有变量,其中包含UTC时间类型为datetime.time的时间,我希望它转换为其他时区。

我们可以在datetime.datetime实例中转换时区,如此SO链接所示 - How do I convert local time to UTC in Python?。我无法弄清楚如何在datetime.time实例中转换时区。我不能使用astimezone,因为datetime.time没有这个方法。

例如:

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

我需要UTC格式的't'。

4 个答案:

答案 0 :(得分:6)

我会创建一个临时日期时间对象,转换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_to_utclinked question中的任何建议。

答案 1 :(得分:1)

使用pytz转换自/到UTC时区的简便方法:

import datetime, pytz

def time_to_utc(naive, timezone="Europe/Istanbul"):
    local = pytz.timezone(timezone)
    local_dt = local.localize(naive, is_dst=None)
    utc_dt = local_dt.astimezone(pytz.utc)
    return utc_dt

def utc_to_time(naive, timezone="Europe/Istanbul"):
    return naive.replace(tzinfo=pytz.utc).astimezone(pytz.timezone(timezone))

# type(naive) """DateTime"""
# type(timezone) """String"""

答案 2 :(得分:0)

有四种情况:

  1. 输入datetime.time已设置tzinfo(例如OP提及UTC)
    1. 输出为非天真时间
    2. 输出为天真时间(tzinfo未设置)
  2. 输入datetime.time未设置tzinfo
    1. 输出为非天真时间
    2. 输出为天真时间(tzinfo未设置)
  3. 正确的答案需要使用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,因此我们只需要转换为{{1 }}

答案 3 :(得分:-3)

您需要pytz。您描述的用例在其主要示例中进行了说明。