pytzを使った時にtimezone情報が19分間ずれるバグを回避する

time-image
Image from pixabay

pythonでtimezoneの情報を指定してdatetimeを作成する際、timezoneとしてpytzで作成した情報を与えると時差の情報が19分間ずれるバグがあります。

2018年9月27日現在の、発生する状況と回避策を簡単に記載します。

環境など

  • python3.6
  • pytz 2017.2

発生状況

datetime.datetime()の引数のtzinfoに、pytzで作成したtimezone情報を渡すときに発生。

import datetime
import pytz

tz_tokyo = pytz.timezone("Asia/Tokyo")
datetime_tokyo = datetime.datetime(2018, 9, 15, 10, 0, 0, tzinfo=tz_tokyo)
print(datetime_tokyo)
# 出力結果
2018-09-15 10:00:00+09:19

回避策

pytzがサポートしているtimezone情報を持つデータの作成方法は2種類です。

  1. timezone情報を持たないnaiveなdatetimeにlocalize()メソッドを使用する方法。
  2. すでに存在しているlocalize済みのデータに対して、astimezone()メソッドを使用する方法。

この辺りはpytzのドキュメントに記載があります。

pytz - World Timezone Definitions for Python — pytz 2014.10 documentation

今回のように、何もないところからdatetimeを作成する場合は1番目の方法をとります。

import datetime
import pytz

tz_tokyo = pytz.timezone("Asia/Tokyo")

# naiveのdatetime作成
datetime_naive = datetime.datetime(2018, 9, 15, 10, 0, 0)

# datetime(naive) -> datetime(Asia/Tokyo)
datetime_tokyo = tz_tokyo.localize(datetime_naive)
print(datetime_tokyo)

出力結果

# 出力結果
2018-09-15 10:00:00+09:00

期待通りの結果が得られました。

まとめ

pytzを使用してdatetimeを作成する際にtimezone情報に19分のずれが発生するケースと回避策を確認しました。

以前別の記事に書いた内容の一部なのですが、必要な時になかなか見つからなかったので、これを機会に抜粋しました。

該当記事の本題はdatetimeとunixtimeの行き来への自分の解法です。必要に応じてご参考まで。

Pythonのdatetimeとposixtimeを行き来するシンプルな方法
Pythonのdatetimeとunixtimeを行き来する、間違いの少なさそうな方法を紹介します。

参考資料

pytzドキュメント