GAE/PのDateTimePropertyのTimezoneに関する注意

Google App EngineのDatestoreには「DateTimeProperty」という日時を管理するPropertyがあります。このPropertyに日時を格納する際に、例え格納するdatetimeのインスタンスがTimezoneを持っていたとしても、TimezoneがUTCであるものとして保存されます。

例) timezoneを指定なしで保存した場合、Asia/Tokyo、UTC

class Hoge(db.Model):
    date = db.DateTimeProperty()
class PutHandler(webapp.RequestHandler):
    def get(self):
        dt = datetime.datetime.utcfromtimestamp(1306647075)
        hoge = Hoge(date=dt)
        hoge.put()
        tz_utc = dateutil.tz.tzutc()
        tz_tokyo = dateutil.tz.gettz("Asia/Tokyo")
        dt = dt.replace(tzinfo=dateutil.tz.tzutc()).astimezone(tz_tokyo)
        hoge = Hoge(date=dt)
        hoge.put()
        dt = dt.astimezone(tz_utc)
        hoge = Hoge(date=dt)
        hoge.put()
        self.response.out.write("PUT")

結果 → すべてのHogeのdateは「2011-05-29 05:31:15」 となります。

これらを取得する際のfilterには、Timezoneが反映されます。

例) すべて取得、Asia/Tokyoの14時30分から35、UTCの14時30から35分

class GetHandler(webapp.RequestHandler):
    def get(self):
        self.response.out.write("—- ALL —-<br/>")
        map(lambda h: self.response.out.write(str(h.date) + "<br/>"), Hoge.all())
        self.response.out.write("—- TZ=TOKYO —-<br/>")
        tz_utc = dateutil.tz.tzutc()
        tz_tokyo = dateutil.tz.gettz("Asia/Tokyo")
        d_from = datetime.datetime(2011,5,29,14,30,0,0, tz_tokyo)
        d_to = datetime.datetime(2011,5,29,14,35,0,0, tz_tokyo)
        map(lambda h: self.response.out.write(str(h.date) + "<br/>"),
                Hoge.all().filter("date >=", d_from).filter("date <", d_to))
        self.response.out.write("—- TZ=UTC —-<br/>")
        d_from = datetime.datetime(2011,5,29,14,30,0,0, tz_utc)
        d_to = datetime.datetime(2011,5,29,14,35,0,0, tz_utc)
        map(lambda h: self.response.out.write(str(h.date) + "<br/>"),
                Hoge.all().filter("date >=", d_from).filter("date <", d_to))

結果

—- ALL —-
2011-05-29 05:31:15
2011-05-29 05:31:15
2011-05-29 05:31:15
—- TZ=TOKYO —-
2011-05-29 05:31:15
2011-05-29 05:31:15
2011-05-29 05:31:15
—- TZ=UTC —-

この記事が役に立った場合、シェアしていただけると励みになります!!