JavaScript で実行環境に左右されず常に JST 日本時間を取得する
JavaScript の new Date() は、実行環境のタイムゾーンの影響を受けてしまう。Date#toLocaleString() という関数で Asia/Tokyo を指定できれば良いのだが、日本のタイムゾーン定義がないマシンではやはり動かない。
コレを何とかするには、Date#getTimezoneOffset() という関数を利用する。コレはその Date オブジェクトが UTC からどのくらいズレているのかを分単位で返す関数。UTC で動作する環境で実行すれば 0 が返ってくるし、JST で動作する環境なら -540 と返ってくる。
ということは、コレを利用して次のようなイディオムを組んでやれば、実行環境のタイムゾーンに左右されず、必ず日本時間が取得できる。
// 取得できる値は必ず日本時間になる
const jstNow = new Date(Date.now() + ((new Date().getTimezoneOffset() + (9 * 60)) * 60 * 1000));
実際に計算してみよう。
- 全体
Date.now()で現在時刻をエポックタイム (ミリ秒単位) で取得する9 * 60で540。JST は UTC の9時間後なので、それを分単位で表現したモノ60 * 1000は分単位からミリ秒単位に変換するためのモノDate.now()に何ミリ秒分足し込むのか、という式になる
- JST で実行される環境では
getTimezoneOffset()の値は-540540と足し合わせるので+ 0分となる- つまり
new Date()およびDate.now()単体と同じ結果で、JST な値が返る
- UTC で実行される環境では
getTimezoneOffset()の値は0540と足し合わせるので+ 540分となる- 「UTC 環境は日本時間より9時間遅れている」と捉え、UTC での現在時刻に540分 (9時間分) を足し込む
- UTC の9時間後の日時情報が返されるので、結果的に JST な値が返る
コレで OK。あとはこのオブジェクトから getHours() などと日時情報を取り出してやれば、必ず JST で日付を扱える。