AWS Lambda でのタイムゾーン変換

記事タイトルとURLをコピーする

はじめに

こんにちは、技術一課の山中です。

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 で扱い、表示する段階でローカル時間に変換する」を意識していればいいかなと思います。