Python でタイムゾーンを考慮した now を取得する

Python におけるタイムゾーンの取り扱いについて、正確に書こうとするとなかなか難しいので、今回やったことだけシンプルに書きたいと思います。

Pythonタイムゾーンを扱うのは難しい。標準ライブラリには tzinfo というタイムゾーンを表すための抽象クラスが用意されているだけなので、それを継承して自前でタイムゾーン用のクラスを定義する必要がある。例えばこんな感じだ。

from datetime import timedelta, tzinfo

class JST(tzinfo):
    def utcoffset(self, dt):
        return timedelta(hours=9)


    def dst(self, dt):
        return timedelta(0)


    def tzname(self, dt):
        return 'JST'

現在の日時を日本標準時(JST)で取得したい場合は、これを使ってこう書ける。

from datetime import datetime

datetime.now(tz=JST())

単に JST を扱いたいだけなら、このように自前で実装してしまえばいいのだけど、もっと複雑なことをやりたい場合はなかなかしんどいので、pytz - World Timezone Definitions for Python — pytz 2014.9 documentation というライブラリがある。これを使うと tzinfo を継承したクラスを簡単に取得できて便利そう。これがデファクトスタンダードっぽい。

まとめ

なんでこんなことをやっているかというと、Google App Engine: Platform as a Service - Google App Engine — Google Cloud Platform 上で JST の現在日時を取得したかったのでした。デフォルトは UTC で変更できないようなので、こういうことをやる必要があります。Google App Engine 上で pytz を扱うために brianmhunt/pytz-appengine · GitHub というのがあるので、もっとちゃんとやる場合はこれを使うとよさそうです。