shou.com
JP / EN

JavaScriptで日本時間を取得して日付を加算減算したりする

Tue Sep 13, 2022
Tue Sep 13, 2022

lambdaのタイムゾーンの設定であれやこれやとやったのでメモ。

lambdaのタイムゾーンは悩みどころの一つです。環境変数の TZ にタイムゾーンを指定することで固定することができるのですが、これは非推奨のやり方です。

Lambda のタイムゾーンを環境変数TZで指定してはいけないっていう話

なので、JavaScriptで日本時間に合わせてやる必要があります。ライブラリを使っても実装できますが、使わなくても簡単に実装できます。

日本時間を取得する

タイムゾーンはUTCが基本ですので、実行環境に左右されずに日本時間を取得することが理想です。

なるほどなぁと思ったのがこちらのブログ。

JavaScript で実行環境に左右されず常に JST 日本時間を取得する

JavaScript の new Date() は、実行環境のタイムゾーンの影響を受けてしまう。Date#toLocaleString() という関数で Asia/Tokyo を指定できれば良いのだが、日本のタイムゾーン定義がないマシンではやはり動かない。

1
2
3
// 取得できる値は必ず日本時間になる
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を使えば言語に応じた日付のフォーマットが可能です。

timeZoneAsia/Tokyoにすれば日本時間に直してくれます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
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

日付の加算減算

加算減算をやる場合は、こんな感じで関数を用意してやると便利ですね。減算の場合は+-にするだけ。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
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

以上です。最初はライブラリを使って実装してました。案外ライブラリなしでも簡単に実装できるものですね。

Tags
Lambda
See Also