LoginSignup
60
36

More than 5 years have passed since last update.

pytzの仕様が変わっている

Last updated at Posted at 2017-04-05

2017-03-30にリリースされたpytz version 2017.2にて日本のtimezoneの形式が変わっている (バグ??)

Stuart Bishopさんが管理している,pythonのタイムゾーン関係のライブラリの最新版(version 2017.2)で,妙な挙動があったので共有します.
http://pythonhosted.org/pytz/#localized-times-and-date-arithmetic

何が変わったのか

今まで

In [1]: import pytz

In [2]: pytz.__version__
Out[2]: '2016.10'

In [3]: pytz.timezone('Asia/Tokyo')
Out[3]: <DstTzInfo 'Asia/Tokyo' JST+9:00:00 STD>

最新バージョン

In [1]: import pytz

In [2]: pytz.__version__
Out[2]: '2017.2'

In [3]: pytz.timezone('Asia/Tokyo')
Out[3]: <DstTzInfo 'Asia/Tokyo' LMT+9:19:00 STD>

作者からのコメント等も見つからなかったのでバグの可能性もあります.

これによる影響

このせいで,DBからの読み出しなどでUTC->JSTの変換をすると,19分ずれることがあります.
バグっぽいのは,ずれることがあるだけで,ずれない処理もあるからです.以下にずれる処理とずれない処理をまとめます.

今まで通りJSTが付与される処理

In [8]: tz = pytz.timezone('Asia/Tokyo')

In [10]: tz.localize(datetime.datetime.now())
Out[10]: datetime.datetime(2017, 4, 5, 9, 24, 56, 215625, tzinfo=<DstTzInfo 'Asia/Tokyo' JST+9:00:00 STD>)

In [11]: datetime.datetime.now(tz=pytz.utc).astimezone(tz)
Out[11]: datetime.datetime(2017, 4, 5, 18, 27, 33, 912014, tzinfo=<DstTzInfo 'Asia/Tokyo' JST+9:00:00 STD>)

tzinfoの表示通りLMTの19分ずれた時刻が付与される処理

In [9]: datetime.datetime.now().replace(tzinfo=tz)
Out[9]: datetime.datetime(2017, 4, 5, 9, 24, 45, 694185, tzinfo=<DstTzInfo 'Asia/Tokyo' LMT+9:19:00 STD>)

手元で試したところ,tz.localize, datetime.astimezone(tz)などの非破壊的な処理ではJSTがきちんと付与されるのですが,
datetime.replace(tz)で強制的にtimezoneを付与するコードを使っているとJSTがつかず,19分ずれてしまうことがわかっています.

その他

  • pytz.timezone('Japan')
    • 同様の結果になりました...

最後に (本題)

  1. 今まで通りのJSTタイムゾーンを取得する方法をご存知の方
    • 助けてください!! コメントで教えていただけると助かります!!
  2. また,もし周りにこのことを知らずにdatetime.replace(tzinfo=tz)を使っている方
    • やばいので直してください!! あなたの時計19分ずれてます!!
  3. (タイムゾーンとかクリティカルなので個人で管理してるpytzのようなライブラリではなく,Python公式で出してほしいものです.)
    • Python3ではdatetime.timezoneがあるようなのでそれに移行するのがよいのかな...
60
36
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
60
36