私は何をする必要がありますか
私はタイムゾーン非対応の日時オブジェクトを持っていますが、他のタイムゾーン対応日時オブジェクトと比較できるように、それにタイムゾーンを追加する必要があります。この1つのレガシーケースでは、アプリケーション全体を知らないタイムゾーンに変換したくありません。
私が試したこと
まず、問題を示すために:
Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49)
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import datetime
>>> import pytz
>>> unaware = datetime.datetime(2011,8,15,8,15,12,0)
>>> unaware
datetime.datetime(2011, 8, 15, 8, 15, 12)
>>> aware = datetime.datetime(2011,8,15,8,15,12,0,pytz.UTC)
>>> aware
datetime.datetime(2011, 8, 15, 8, 15, 12, tzinfo=<UTC>)
>>> aware == unaware
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't compare offset-naive and offset-aware datetimes
最初に、私はastimezoneを試しました:
>>> unaware.astimezone(pytz.UTC)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: astimezone() cannot be applied to a naive datetime
>>>
これが実際に変換しようとしているので、これが失敗したことは驚くに値しません。置換はより良い選択のように見えました(Pythonのように:「タイムゾーンに対応」しているdatetime.today()の値を取得する方法?):
>>> unaware.replace(tzinfo=pytz.UTC)
datetime.datetime(2011, 8, 15, 8, 15, 12, tzinfo=<UTC>)
>>> unaware == aware
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't compare offset-naive and offset-aware datetimes
>>>
しかし、ご覧のとおり、replaceはtzinfoを設定しているように見えますが、オブジェクトを認識していません。入力文字列を解析して、解析する前にタイムゾーンを取得する準備を整えています(重要な場合は、解析にdateutilを使用しています)が、信じられないほど不器用に思えます。
また、これをpython 2.6とpython 2.7の両方で試したところ、同じ結果が得られました。
環境
一部のデータファイルのパーサーを作成しています。日付文字列にタイムゾーンインジケータがない場合にサポートする必要がある古い形式があります。データソースは修正済みですが、レガシデータ形式をサポートする必要があります。従来のデータの1回限りの変換は、さまざまなビジネスBSの理由からオプションではありません。一般に、デフォルトのタイムゾーンをハードコーディングするという考えは好きではありませんが、この場合は最良のオプションのようです。問題のレガシーデータはすべてUTCであることを私は合理的な自信を持って知っているので、この場合はデフォルトに設定するリスクを受け入れる用意があります。
import datetime; datetime.datetime.now(datetime.timezone.utc)
tz
引数を使用して読みやすくしますdatetime.datetime.now(tz=datetime.timezone.utc)
unaware.replace()
オブジェクトをインプレースでNone
変更している場合に戻りunaware
ます。REPLは、ここで.replace()
新しいdatetime
オブジェクトを返すことを示しています。