Pythonで日付や時間を扱う際には、datetime
モジュールが一般的に使用されます。しかし、datetime
の扱いには注意が必要で、特にタイムゾーンの扱いは混乱を招くことがあります。
datetimeとタイムゾーン
Pythonのdatetime
には、タイムゾーン情報を持つaware
型と、タイムゾーン情報を持たないnaive
型があります。aware
型のdatetime
オブジェクトは絶対的な時間を表し、Unixtimeへの変換も可能です。一方、naive
型のdatetime
オブジェクトは、タイムゾーンの情報がないため、Unixtimeなど絶対的な時間に変換するにはローカルのタイムゾーン情報への依存が必要となります。
タイムゾーンのズレ問題
Pythonのdatetime
でタイムゾーンを扱う際には、pytz
というライブラリがよく使用されます。しかし、pytz
を使用してdatetime
オブジェクトにタイムゾーンを設定すると、時刻がずれる問題が報告されています。例えば、pytz
から生成したタイムゾーンのオブジェクトでdt.replace(tzinfo=tokyo)
としたり、datetime(2019, 11, 3, 1, 0, 0, tzinfo=tokyo)
のようにすると、19分ずれる問題があります。
解決策
タイムゾーンのズレ問題を解決するためには、datetime
オブジェクトを作成する際にタイムゾーンを明示的に指定することが推奨されています。例えば、datetime.now(tz=JST)
のようにnow
メソッドの引数にタイムゾーンを指定することで、確実に日本時間を取得することができます。
以上、Pythonのdatetime
とタイムゾーンの扱いについて解説しました。タイムゾーンの扱いは複雑ですが、適切に理解し、正しく使用することで、多くのバグを防ぐことができます。