15

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

我们可以转换 datetime.datetime 实例中的时区,如这个 SO 链接所示 -如何在 Python 中将本地时间转换为 UTC?. 我无法弄清楚如何在 datetime.time 实例中转换时区。我不能使用 astimezone 因为 datetime.time 没有这个方法。

例如:

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

我需要 UTC 格式的“t”。

4

3 回答 3

13

有四种情况:

  1. 输入datetime.timetzinfo设置(例如 OP 提到 UTC)
    1. 输出为非天真时间
    2. 输出为幼稚时间(tzinfo未设置)
  2. 输入未 datetime.time设置tzinfo
    1. 输出为非天真时间
    2. 输出为幼稚时间(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.

于 2018-03-25T12:35:04.913 回答
8

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

于 2013-05-17T07:41:52.960 回答
0

Easy way to convert from/to UTC timezone using pytz:

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"""
于 2015-02-20T13:52:26.860 回答