Hatena::ブログ(Diary)

もちおのWEBアプリ開発日記 このページをアンテナに追加 RSSフィード

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

http://mitc.xrea.jp/diary/0100