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()
の値は-540
540
と足し合わせるので+ 0
分となる- つまり
new Date()
およびDate.now()
単体と同じ結果で、JST な値が返る
- UTC で実行される環境では
getTimezoneOffset()
の値は0
540
と足し合わせるので+ 540
分となる- 「UTC 環境は日本時間より9時間遅れている」と捉え、UTC での現在時刻に540分 (9時間分) を足し込む
- UTC の9時間後の日時情報が返されるので、結果的に JST な値が返る
コレで OK。あとはこのオブジェクトから getHours()
などと日時情報を取り出してやれば、必ず JST で日付を扱える。