在python中指定时区感知时间

在python中指定时区感知时间,python,datetime,timezone,Python,Datetime,Timezone,我试图使用datetime.time对象在python中指定一组时区感知时间。然而,pytz库似乎并没有很好地支持这一点:使用US/Pacific返回一个奇数时区,它与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.time对象在python中指定一组时区感知时间。然而,pytz库似乎并没有很好地支持这一点:使用US/Pacific返回一个奇数时区,它与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.time(10,52,tzinfo=pytz.timezone(“美国/太平洋”))
datetime.time(10,52,tzinfo=)
支持的方法似乎是对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'
pytz.timezone(“美国/太平洋”).本地化(datetime.datetime(2011,6,27,2,0,0)) datetime.datetime(2011,6,27,2,0,tzinfo=) >>>pytz.时区(“美国/太平洋”).本地化(datetime.time(10,45)) 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 文件“/bar/.virtualenvs/foo/lib/python2.7/site packages/pytz/tzinfo.py”,第309行,本地化 loc_dt=dt+delta TypeError:不支持+:“datetime.time”和“datetime.timedelta”的操作数类型
问题是时区在
时间上没有意义,没有相关日期;假设你有一个美国/太平洋时区的日期,这不是一个固定的偏移量;实际调整取决于
时间
预计发生的确切日期

正如您所注意到的,如果您按原样使用
美国/太平洋
,而不使用
本地化
,则对于
日期时间
,默认情况下
tzinfo
对象指的是历史时区,该时区即使按整小时也不与当前UTC偏移,而是某些分数;这是因为
tzinfo
实例不知道它们正在调整的
datetime
时间
也会出现同样的问题


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

如果您没有与时间关联的日期,则无论您使用哪种类别,您都会在夏令时方面遇到问题。确切地说,这也没有其他问题的答案。事实并非如此。Python确实支持
tzinfo
对象的
time
,还有
datetime
对象的
timetz()
,因此您可以拥有适当的偏移感知
time
对象。在我看来,just pytz不支持时间对象的
tzinfo
。工作:
print(time(hour=14,minute=0,tzinfo=timezone(timedelta(hours=-4))
不工作:
print(time(hour=14,minute=0,tzinfo=pytz.timezone('US/Eastern'))
@DmitryMugtasimov显然你忽略了我在回答中所说的一切。这就是如何将时间对象转换为可用的时区:
from datetime import timezone,timedelta,datetime;时区(timedelta(seconds=datetime.now(tzinfo).utcoffset().total_seconds()))