Pythonでタイムゾーン対応の日時オブジェクトを作成するにはどうすればよいですか?

| | | | | | | | | | | | | | | | | | |

必要な作業

タイムゾーンを認識しない日時オブジェクトがあり、他のオブジェクトと比較できるようにタイムゾーンを追加する必要がありますタイムゾーン対応の日時オブジェクト。この1つのレガシーケースを認識せずに、アプリケーション全体をタイムゾーンに変換したくありません。

試したこと

まず、問題を実証します:

  Python 2.6.1(r261:67515、2010年6月24日、21:47:49)[GCC 4.2.1(Apple Inc.ビルド5646)]ダーウィンタイプ「ヘルプ」 、「著作権」、「クレジット」、または「ライセンス」で詳細を確認してください。>>> import datetime>>> import pytz>>> unware = datetime.datetime(2011,8 、15,8,15,12,0)>>>認識されていないdatetime.datetime(2011、8、15、8、15、12)>>>認識されている= datetime.datetime(2011,8、 15,8,15,12,0、pytz.UTC)>>> know datetime.datetime(2011、8、15、8、15、12、tzinfo =< UTC>)>>>認識==認識しないトレースバック(最後の最後の呼び出し):ファイル"< stdin>&quot ;、 1行目< module> TypeError:オフセットなしとオフセット認識の日時を比較できません 

まず、astimezoneを試しました:

 >>> unaware.astimezone(pytz.UTC)トレースバック(最後の最後の呼び出し):ファイル"< stdin>&quot ;、 1行目< module> ValueError:astimezone()を単純な日時に適用することはできません>>>  

実際に変換を行おうとしているので、これが失敗したことはそれほど驚くことではありません。置換はより良い選択のように思われました(Pythonでdatetime.today()の値を取得するにはどうすればよいですか?):

 >>> unaware.replace(tzinfo = pytz.UTC)datetime.datetime(2011、8、15、8、15、12、tzinfo =< UTC>)>>>認識しない==認識するトレースバック(最後の最後の呼び出し):ファイル"< stdin>&quot ;、 1行目< module> TypeError:オフセットなしの日時とオフセット対応の日時を比較できません>>>  

しかし、ご覧のとおり、replaceはtzinfoを設定しているように見えますが、オブジェクトを認識させません。私は、入力文字列を解析する前に、タイムゾーンを設定するためのドクターにフォールバックする準備をしています(それが重要な場合は、dateutilを解析に使用しています)が、それは非常に厄介なようです。

また、 Python2.6とPython2.7の両方でこれを試しましたが、同じ結果になりました。

コンテキスト

いくつかのデータファイルのパーサーを作成しています。日付文字列にタイムゾーンインジケーターがない場合にサポートする必要のある古い形式があります。私はすでにデータソースを修正しましたが、レガシーデータ形式をサポートする必要があります。レガシーデータの1回限りの変換は、さまざまなビジネスBSの理由からオプションではありません。一般的に、ハードのアイデアは好きではありません。 -デフォルトのタイムゾーンをコーディングする場合、この場合は最良のオプションのようです。問題のレガシーデータはすべてUTCであることが十分にわかっているので、この場合はデフォルトのリスクを受け入れる準備ができています。< / p>