やりたいこと
AWS Lambdaで時間を扱うのに、日本時間JSTが欲しい。(本当はローカルタイムが欲しい。)
だけど、Lambdaではローカルタイムという概念がないらしく、全てUTCになってしまう。
日本時間JSTが欲しいと思っていると、9時間ずれた値が返ってきたり、表示が19/9/2022
となって欧米か!とツッコミたくなったり、してしまう。
ちなみに、なんでそんなことしたいかというとコレです↓
実装!
色々調べたが簡単に済ませたかったので、とりま+9時間してJ、日本的なフォーマットに自力でした。
let dateTime = new Date();
// JSTにする
time.setHours(dateTime.getHours() + 9);
// 2022/9/19の形にする
const year = dateTime.getFullYear();
const month = dateTime.getMonth()+1;
const day = dateTime.getDate();
const targetDate = `${year}/${month}/${day}`
参考:https://www.sejuku.net/blog/22925
これでやりたいことはできましたが、なんかめんどくさい。
もっと簡潔にできないのかなーと思いつつ。
うまくいかなったもの
Lambda環境変数TZ
環境変数でTZ
をセットするといいよーという記事がたくさんありますが、予約語なので悪手らしい。実際に試してないので、動くのかもわからない。
定義されたランタイム環境変数
Lambda ランタイムは、初期化中にいくつかの環境変数を設定します。ほとんどの環境変数は、関数またはランタイムに関する情報を提供します。これらの環境変数のキーは予約済みであるため、関数設定では設定できません。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-envvars.html#configuration-envvars-runtime
というリストの中にTZ
入っています。
toLocaleXXXString()系
Date.prototype.toLocaleDateString()
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleDateString
Date.prototype.toLocaleTimeString()
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleTimeString
Number.prototype.toLocaleString()
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Number/toLocaleString
// 引数でローカルを指定してもダメ
new Date().toLocaleDateString('jp-JP');
new Date().toLocaleString({ timeZone: 'Asia/Tokyo' });
最後に
これだとアプリが日本でしか使えないので、本当はローカルタイムを取れるようにして世界中で使えるようになりたい。
ま、そんなことは海外にdistributionするときに考えるか。
その他参考にしたもの。