6

Pythonモジュールを使用して2回比較しようとしていますが、UTCでdatetimeタイムゾーン対応オブジェクトを作成できないようです。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タイムゾーンはありますか?どうしたの?

4

3 に答える 3

9

これを不可解にしてくれた wberry のおかげですが、簡潔な答えを得るために、ここで要約します。

datetime docs によると、2 つの datetime.time オブジェクトを比較する場合:

あなたが示した例では、EASTERN_TZ.utcoffset() が None を返すため、比較は TypeError をスローします。米国東部では夏時間が適用され、UTC からの時間オフセットは datetime.time で利用できない日付に依存するため、utcoffset は None です。

タイムゾーン間の比較には 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
于 2012-05-09T22:49:32.617 に答える
3

特定の UTC インスタントに関連付けることができる 1 つのオブジェクトと、「ナイーブ」で特定の UTC インスタントに関連付けることができないtime別のオブジェクトとの違いを測定しようとしているため、エラーが発生します。time修正は、両方のコンパランドをオフセット対応にするか、両方をナイーブにすることです。

以下は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
于 2012-05-09T21:47:42.487 に答える
1

問題は、おそらくUTCが非タイムゾーンまたは「オフセットナイーブ」であると見なされていることだと思いますか? 比較を行う前に、すべてを UTC に変換することをお勧めします。

もちろん、入力と出力のタイムゾーンを知る必要がありますが、内部表現をすべて UTC に保つようにし、各ユーザーのタイムゾーンを保存して、必要に応じて変換する必要があります。長期的には、多くの頭痛を軽減します。

また、このようにしてはいけません。使ったほうがいい

timezone.localize(dt)

ここで説明されているように: http://pytz.sourceforge.net/#localized-times-and-date-arithmetic

于 2012-05-09T21:22:57.780 に答える