在 python 中指定时区感知时间

Specifying timezone aware times in python

我正在尝试使用 datetime.time 对象在 python 中指定一组时区感知时间。然而,pytz 库似乎并没有很好地支持这一点:使用 US/Pacific returns 一个奇数时区,它比 UTC

晚 53 分钟
>>> datetime.time(10, 52, tzinfo=pytz.timezone("US/Pacific"))
datetime.time(10, 52, tzinfo=<DstTzInfo 'US/Pacific' LMT-1 day, 16:07:00 STD>)

支持的方法似乎是对 datetime.datetime 个对象使用 datetime.localize,但 datetime.time 个对象不支持此方法

>>> pytz.timezone("US/Pacific").localize(datetime.datetime(2011, 6, 27, 2, 0, 0))
datetime.datetime(2011, 6, 27, 2, 0, tzinfo=<DstTzInfo 'US/Pacific' PDT-1 day, 17:00:00 DST>)
>>> pytz.timezone("US/Pacific").localize(datetime.time(10, 45))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/bar/.virtualenvs/foo/lib/python2.7/site-packages/pytz/tzinfo.py", line 309, in localize
    loc_dt = dt + delta
TypeError: unsupported operand type(s) for +: 'datetime.time' and 'datetime.timedelta'

问题是 time 的时区 毫无意义 ,没有关联的日期;假设你在 US/Pacific 时区有一个日期,这不是一个常量偏移量;实际调整取决于 日期 time 应该发生。

如您所见,如果您按原样使用 US/Pacific 而没有 localize,对于 datetime,默认情况下 tzinfo 对象指的是历史时区这甚至没有被当前的 UTC 抵消整小时,而是一些分数;那是因为 tzinfo 实例不知道它们正在调整的 datetimetime.

也会出现同样的问题

最好的做法是不为 time 使用时区;当需要时区计算时,您可以将其与本地化的 datetime 对象合并。