はじめに
こんにちは、技術一課の山中です。
Python のタイムゾーンについて、学んだことを忘れないようにブログにまとめました。
Python の組み込みモジュールである datetime を利用して現在時刻を取得する場合、通常以下のように記載すると思います。
def lambda_handler(event=None, context=None): now = datetime.now() print(now) if __name__ == '__main__': lambda_handler()
これを私のローカル PC で実行した結果は以下のとおりです。
2019-06-02 10:32:47.529957
同じものを AWS Lambda で実行してみると出力結果は以下のようになります。
2019-06-02 01:36:05.075726
同じコードを実行していてもかなり出力結果が異なります。
これは AWS Lambda の実行環境と私のローカル PC の実行環境とでタイムゾーンが異なることで起こります。
タイムゾーンの変換
AWS Lambda の実行環境におけるタイムゾーンは UTC ですが、出力時には JST タイムゾーンで出力したいケースがあります。
Python でのタイムゾーン変換は pytz モジュールで行います。
pytz は必要となるすべてのタイムゾーンの完全なデータベースを含んでいるので、任意のタイムゾーンに変換することが可能です。
from datetime import datetime, timezone def lambda_handler(event=None, context=None): now = datetime.now(tz=timezone.utc) tokyo = pytz.timezone('Asia/Tokyo') # 東京のローカル時間に変換 jst_now = tokyo.normalize(now.astimezone(tokyo)) print(jst_now) if __name__ == '__main__': lambda_handler()
これを私のローカル PC で実行した結果は以下のとおりです。
2019-06-02 11:09:42.855108+09:00
同じものを AWS Lambda で実行した結果以下のとおりです。
2019-06-02 11:09:42.752163+09:00
pytz は標準モジュールではないため、 AWS Lambda で利用する場合は、 zip でアップロードしてください。
おわりに
タイムゾーンを意識していないと結果が想定どおりに出ずあれ?となることが多くありますが、いつも「コード内での時間は常に UTC で扱い、表示する段階でローカル時間に変換する」を意識していればいいかなと思います。