2012-05-29 pythonのtimezoneでハマった

pythonのdatetimeのtimezoneでハマったのでメモ。
pythonからDBに保存されたdatetime型のデータにアクセスしたいが保存されたデータがUTCになっている。
これをJSTに変換したい。
例)変換無し
import pymongo db = pymongo.Connection('localhost', 27017).test row = db.test.find_one() updated = row['updated'] print updated
実行結果
2012-05-29 06:23:09.962000
このdatetimeオブジェクトはtzinfoがNoneになっていてupdated.astimezone(tz)などとしようとすると
ValueError: astimezone() cannot be applied to a naive datetime
と言われ変換できない。
一旦tzinfoにUTCと設定してから変換する必要がある。
例)変換有り
import datetime, pytz import pymongo utc = pytz.timezone('UTC') jst = pytz.timezone('Asia/Tokyo') db = pymongo.Connection('localhost', 27017).test row = db.test.find_one() updated = row['updated'].replace(tzinfo=utc).astimezone(jst) print "updated = %s" % updated
実行結果
updated = 2012-05-29 15:23:09.962000+09:00
成功した。
ちなみにtzinfoを直接書き換えようとすると
AttributeError: attribute 'tzinfo' of 'datetime.datetime' objects is not writable
とか言われちゃう。
以下、参考URL
コメント