Pythonでのタイムゾーン

Python でタイムゾーンを考慮した時刻を扱うのはちょっと面倒。
datetime ライブラリの日付や時刻のオブジェクトには “naive” と “aware” の2種類があって、”naive” なオブジェクトはタイムゾーンに関する情報を持っていない。

>>> from datetime import datetime
>>> now = datetime.now()
>>> now
datetime.datetime(2015, 11, 23, 11, 9, 51, 831037)
>>> utc_now = datetime.utcnow()
>>> utc_now
datetime.datetime(2015, 11, 23, 2, 10, 6, 927019)

だからタイムゾーンを考慮した日付・時刻を扱おうとすると “aware” なオブジェクトにしないといけない。で、タイムゾーンを表すには datetime.tzinfo クラスを使うんだけど、これは抽象クラスであって実際に使うにはタイムゾーンそれぞれのサブクラスを作らなきゃいけない。
リファレンスマニュアルの例を参考に書いてみたのがこれ。

from datetime import datetime, timedelta, tzinfo

class UTC(tzinfo):
    def utcoffset(self, dt):
        return timedelta(0)

    def tzname(self, dt):
        return "UTC"

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

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

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

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


if __name__ == '__main__':
    now = datetime.now(JST())
    print now
    print now.utcoffset()

    utc_now = now.astimezone(UTC())
    print utc_now
    print utc_now.utcoffset()

datetime.tzinfo のサブクラスとして UTC と JST を定義している。これを使うとタイムゾーンを考慮した時刻を扱うことができる。こんな感じ:

>>> import test_tzinfo
>>> jst = test_tzinfo.JST()
>>> now = datetime.now(jst)
>>> now
datetime.datetime(2015, 11, 23, 11, 21, 51, 47529, tzinfo=<test_tzinfo.JST object at 0x7f9fa1686b50>)
>>> utc = test_tzinfo.UTC()
>>> utc_now = now.astimezone(utc)
>>> utc_now
datetime.datetime(2015, 11, 23, 2, 21, 51, 47529, tzinfo=<test_tzinfo.UTC object at 0x7f9fa1686c90>)

タイムゾーンを簡単に扱えるようにするライブラリもあるようだけど、少なくとも標準の機能だけだとちょっと面倒、という話でした。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください