Google App Engine の時刻表示について

「一度、UTC をセットしてから JST で取り出す。」
Google App Engine では、"create_date = db.DateTimeProperty(auto_now_add=True)" のように記述したモデルのプロパティを取り出すと、タイムゾーンの設定されていない naive な datetime となる。

値は UTC で記録されるのだが、native オブジェクトは astimezone が使えないため、直接 JST で取り出すことができない。

そこで、replace を使って、一度、タイムゾーンUTC にセットし、その後で JST を取得するという手続きを踏む必要がある。

# JST
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'

# UTC
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 strdatetime(val):
     return '' if not val else val.replace(tzinfo=UtcTzinfo()).astimezone(JstTzinfo()).strftime('%Y.%m.%d %H:%M:%S')

# 使用例
print strdatetime(create_date)