lambdaのタイムゾーンの設定であれやこれやとやったのでメモ。
lambdaのタイムゾーンは悩みどころの一つです。環境変数の TZ にタイムゾーンを指定することで固定することができるのですが、これは非推奨のやり方です。
Lambda のタイムゾーンを環境変数TZで指定してはいけないっていう話
なので、JavaScriptで日本時間に合わせてやる必要があります。ライブラリを使っても実装できますが、使わなくても簡単に実装できます。
タイムゾーンはUTCが基本ですので、実行環境に左右されずに日本時間を取得することが理想です。
なるほどなぁと思ったのがこちらのブログ。
JavaScript で実行環境に左右されず常に JST 日本時間を取得する
JavaScript の new Date() は、実行環境のタイムゾーンの影響を受けてしまう。Date#toLocaleString() という関数で Asia/Tokyo を指定できれば良いのだが、日本のタイムゾーン定義がないマシンではやはり動かない。
// 取得できる値は必ず日本時間になる
const jstNow = new Date(Date.now() + ((new Date().getTimezoneOffset() + (9 * 60)) * 60 * 1000));
console.log(jstNow);
これなら日本のタイムゾーン定義がないlambdaでもイケる。
最初はこれでもいいかぁと思って実装しようとしましたが、返り値が2022-09-13T11:50:14.999Z
なのでいちいちフォーマットを揃える必要がある。日付の加算減算がなければこれでもたいして面倒ではないですが、ある場合はちょっと面倒。
そこで使ったのが、Intl.DateTimeFormat。
Intl.DateTimeFormat
を使えば言語に応じた日付のフォーマットが可能です。
timeZone
をAsia/Tokyo
にすれば日本時間に直してくれます。
const dateTimeFormat = new Intl.DateTimeFormat("ja-JP", {
month: "long",
day: "numeric",
hour: "numeric",
minute: "numeric",
hourCycle: "h23",
timeZone: "Asia/Tokyo"
});
console.log(dateTimeFormat.format(new Date()));
> 9月13日 21:06
加算減算をやる場合は、こんな感じで関数を用意してやると便利ですね。減算の場合は+
を-
にするだけ。
Date.prototype.addDays = function (days) {
const date = new Date(this.valueOf());
date.setDate(date.getDate() + days);
return date;
};
Date.prototype.addHours = function (hours) {
this.setTime(this.getTime() + hours * 60 * 60 * 1000);
return this;
};
console.log(dateTimeFormat.format(date.addDays(7)));
console.log(dateTimeFormat.format(date.addHours(1)));
>9月20日 21:22
>9月13日 22:22
以上です。最初はライブラリを使って実装してました。案外ライブラリなしでも簡単に実装できるものですね。