Edited at

pytzの仕様が変わっている

More than 1 year has passed since last update.


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があるようなのでそれに移行するのがよいのかな...