Google App EngineのタイムゾーンがUTCなので。
Types and Property Classes - Google App Engine - Google Code
pytz - World Timezone Definitions for Python
Time zones in Google App Engine
日付変更線に近いところへお住まいの我々は困りますよね。や、別に困りはしませんが、面倒ですよね。って事で、変換しております。
最初、
timestamp + datetime.timedelta(hours=9)
なんて事をやっていたのですけど、「あんまりだなぁ」と思ってGoogleさんのドキュメントを参考にpytzを使って
timestamp.replace(tzinfo=pytz.utc).astimezone(pytz.timezone(settings.TIME_ZONE))
なんてやっていて、「settings.pyで設定したTIME_ZONEの値を使えるのがいいよ、なんかたくさん無駄なリソースが入っちゃうけど」と思っていたところへ某方面からヒントとか言って送りつけられたページ(←三つ目のURL)のソースをパクって落ち着いたのが、
import datetime
class UtcTzinfo(datetime.tzinfo):
def utcoffset(self, dt):
return datetime.timedelta(0)
def dst(self, dt):
return datetime.timedelta(0)
def tzname(self, dt):
return 'UTC'
def olsen_name(self):
return 'UTC'
class JstTzinfo(datetime.tzinfo):
def utcoffset(self, dt):
return datetime.timedelta(hours=9)
def dst(self, dt):
return datetime.timedelta(0)
def tzname(self, dt):
return 'JST'
def olsen_name(self):
return 'Asia/Tokyo'
def jst_date(value):
if not value:
value = datetime.datetime.now()
value = value.replace(tzinfo=UtcTzinfo()). \
astimezone(JstTzinfo())
return value
で、モデルの方にこのメソッドを呼び出すメソッドを書いて(return hoge.jst_date(self.created)とか)、そのメソッドをテンプレートの方でDjangoのfilterを噛まして({{ object.jst_created|date:"Y/m/d H:i:s" }}とか)表示させてます。
まー、こんなものでひとつ。