目的
・JSTとUTCについて知る
・Node.jsでUTCからJSTに変換する方法についてまとめる
現象
AngularMaterialのdatepickerを使用して、以下のように日付を選択して、取得した日付データを確認する。
このようにJSTで表示される。ただ、これをNode.js+Expressで実装されたAPIに送信すると、以下のように、UTCで表現される。
UTCとJSTについてはこちらの記事にまとまっている。
原因
この現象が起きる原因としてはDateオブジェクトがクライアントとサーバで異なるタイムゾーンで解釈されるためである。Angularではブラウザのローカルタイムゾーンに基づいているので、画面上で選択した値になっているが、Node上ではUTCに変換されるためこのような現象が起きている。
この現象はChromeで確認したが、Chromeで利用されているタイムゾーンはOSのタイムゾーン情報が反映されているらしい。
対処法
対処法としては以下のようなことが考えられる。
時差を補正する
UTCに変換されたデータをExpress側でJSTに変換する。
convertUtcToJst(date: Date):string => {
// UTC形式の日時を文字列に変換
const utcDateString: string = date.toISOString();
// UTC形式の日時文字列からUTCのDateオブジェクトを生成
const utcDate: Date = new Date(utcDateString);
// JST(日本標準時)のオフセットを計算(9時間 * 60分)
const jstOffset = 9 * 60;
// UTCのDateオブジェクトにオフセットを加算してJSTのDateオブジェクトを生成
const jstDate: Date = new Date(utcDate.getTime() + jstOffset * 60000);
// JSTのDateオブジェクトをISO 8601形式の文字列に変換
const jstDateString: string = jstDate.toISOString();
// JST形式の日時文字列を返す
return jstDateString;
}
JSTはUTCよりも9時間進んでいるのでオフセットを計算して取得したUTCの値に加算している。またJSTに変換後にISO8601形式に変換している。ISO8601形式とは、日付と時刻の表記に関する国際規格のことで以下のページで詳しく説明されている。
今回はこちらの方法で対処した。
サーバ側のタイムゾーンをJSTに変換する
Node.jsのタイムゾーンを JSTに変換する方法もある。ただ、今回使用しているOSはWindowsでWindowsでは環境変数を編集することで特定のアプリケーションのタイムゾーンだけを変更するということができないので、今回はこの対応は行わなかった。MacやLinuxを使用して、なおかつ、プログラムの至る所でJSTへの変換処理を行なっている場合にはこちらの対応策を検討してもいいかも知れない。