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