24
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

LambdaのNode.js v8.10でタイムゾーンを指定してもDateがUTCになる問題

Last updated at Posted at 2018-05-18

AWS LambdaのNode.jsランタイムでv8.10が公開された時に、喜び勇んでasync/awaitで書き換えて更新した時にハマった点。

tl;dr

TZ環境変数はコード側ではなくLambdaの環境変数に設定しよう

Dateのタイムゾーン(TZ)がUTCになる

v0.10の頃から更新してきた関数だったので、タイムゾーンを日本にするためにコードの先頭でこう書いていました。


process.env.TZ = "Asia/Tokyo";

これでDateを処理する時に日本時間でうまく動いていましたが、ランタイムをv8.10にするとUTCになってしまいました。

検証するために、こんな関数を作成したところレスポンスは 1525651200000 になりました。
このunixtime(ms)は日本時間だと 2018/05/07 09:00:00 となりUTCとして扱われてしまっています。

"use strict";
process.env.TZ = "Asia/Tokyo";

exports.handler = (event, context, callback) => {
    const time = Date.parse('2018-05-07 00:00:00');
    callback(null, time);
};

Lambda関数自体に環境変数を保存する機能が結構前からありますので、
そこに下記のように TZ Asia/Tokyoを設定してあげると、正しいunixtime 1525618800000 が得られました。

スクリーンショット 2018-05-18 12.17.28.png

念のため現在選択できるNode.jsランタイム 8.10, 6.10, 4.3 で上記コードで検証したところ
6.10, 4.3ではコード側の設定でも日本時間で動作しました。

- v8.10 v6.10 v4.3
Lambda環境変数のTZ指定あり 1525618800000 1525618800000 1525618800000
Lambda環境変数のTZ指定なし 1525651200000 (コードでの指定が効いていない) 1525618800000 1525618800000

v6.10やv4.3の関数に設定しても問題ないので、環境変数を設定してからランタイム/コードをバージョンアップしましょう。

24
11
2

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
24
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?