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

新手上路,请多包涵

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

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

例如:

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

我需要 UTC 格式的“”。

原文由 rajpy 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 601
1 个回答

有四种情况:

  1. 输入 datetime.timetzinfo 设置(例如OP提到UTC)
    1. 输出为非天真时间
    2. 输出为原始时间( tzinfo 未设置)
  2. 输入 datetime.timetzinfo 未设置
    1. 输出为非天真时间
    2. 输出为原始时间( tzinfo 未设置)

The correct answer needs to make use of datetime.datetime.timetz() function because datetime.time cannot be built as a non-naive timestamp by calling localize() or 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

原文由 Dorian B. 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题