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

时间:2012-05-09 21:13:31

标签: python datetime timezone pytz

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

>>> 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

这是一个错误吗?我需要使用特殊的UTC时区吗?发生了什么事?

3 个答案:

答案 0 :(得分:6)

所有归功于wberry令人费解,但为了得到简明的答案,我会在这里总结一下。

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

在您给出的示例中,比较会抛出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

答案 1 :(得分:3)

您收到错误是因为您正在尝试衡量一个time对象与特定UTC时刻之间的差异,另一个time对象是“天真的”并且无法绑定到特定的UTC时刻。修复要么是使两个比较都能识别偏移,要么都是天真的。

以下使用datetime个对象,但基本相同。

import datetime, time, pytz

EST = pytz.timezone('America/New_York')
UTC = pytz.timezone('Etc/UTC')
dt1 = datetime.datetime.fromtimestamp(time.time(), EST)
# ... time passes
dt2 = datetime.datetime.fromtimestamp(time.time(), UTC)
elapsed = dt2 - dt1

答案 2 :(得分:1)

我猜这个问题是,UTC被认为不是任何时区,或者“偏向天真”,或许?我建议在进行任何比较之前将所有内容都转换为UTC。

显然,您需要知道输入和输出的时区,但是您应该尝试将所有内部表示保留在UTC中,并且可以只存储每个用户的时区并在需要时进行转换。从长远来看,这将节省很多麻烦。

另外,你不应该这样做。最好使用

timezone.localize(dt)

如下所述:http://pytz.sourceforge.net/#localized-times-and-date-arithmetic