使用Python将UTC时间与东部时间进行比较

Chr*_* B. 5 python timezone datetime pytz

我正在尝试使用Python datetime模块进行两次比较,但我似乎无法time在UTC中创建时区感知对象.

>>> import pytz, datetime
>>> UTC_TZ = pytz.utc
>>> EASTERN_TZ = pytz.timezone('America/New_York')
>>> d1 = datetime.time(10, tzinfo = UTC_TZ)
>>> d1
datetime.time(10, 0, tzinfo=<UTC>)
>>> d2 = datetime.time(10, tzinfo = EASTERN_TZ)
>>> d2
datetime.time(10, 0, tzinfo=<DstTzInfo 'America/New_York' EST-1 day, 19:00:00 STD>)
>>> d1 < d2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't compare offset-naive and offset-aware times
Run Code Online (Sandbox Code Playgroud)

这是一个错误吗?我需要使用特殊的UTC时区吗?这是怎么回事?

Cor*_*rke 6

所有这些都归功于wberry令人费解的问题,但为了得到简明的答案,我将在此总结一下.

根据日期时间文档,当比较两个datetime.time对象时:"如果两个比较都知道并且具有不同的tzinfo属性,则首先通过减去它们的UTC偏移(从self.utcoffset()获得)来调整比较"

在您给出的示例中,比较会抛出TypeError,因为EASTERN_TZ.utcoffset()返回None.utcoffset为None,因为美国东部观察夏令时,因此与UTC的时间偏移取决于datetime.time中不可用的日期.

您应该使用datetime.datetime对象进行跨时区比较:

>>> import pytz, datetime
>>> UTC_TZ = pytz.utc
>>> EASTERN_TZ = pytz.timezone('America/New_York')
>>> d1 = datetime.datetime(2012, 1, 1, 10, 0, tzinfo=UTC_TZ)
>>> d2 = datetime.datetime(2012, 1, 1, 10, 0, tzinfo=EASTERN_TZ)
>>> d1 < d2
True
Run Code Online (Sandbox Code Playgroud)