Node.jsにおけるJSONシリアライズ時のDate型UTC形式対応

Node.jsでJSONシリアライズを行う際、Date型はデフォルトでUTC形式に変換されます。
$ node
> new Date();
2023-11-15T08:45:22.310Z
この挙動はExpressフレームワークを使用するWeb API開発で顕著になります。例えば、サーバーログに記録される時刻が現地時間(JSTなど)で表示されても、APIが返すJSONデータではUTC形式で出力されるため、時差が発生します。
この現象の原因は、JSON仕様がDate型をシリアライズする際にUTC形式を採用しているためです。解決策として、DateプロトタイプのtoJSONメソッドをオーバーライドする方法があります:
Date.prototype.toJSON = function() {
  const format = (num) => num.toString().padStart(2, '0');
  return `${this.getFullYear()}-${format(this.getMonth()+1)}-${format(this.getDate())}T${
    format(this.getHours())}:${format(this.getMinutes())}:${format(this.getSeconds())}`;
};
この修正により、ローカルタイムゾーンを含むISO 8601形式で出力されます:
$ node
> new Date().toJSON();
'2023-11-15T17:45:22'
Expressアプリケーションでは、このコードを起動スクリプト(通常はbin/www)に追加します。これにより、APIレスポンスでローカルタイムゾーンを保持した時刻を返せます。
この挙動はSequelizeなどのORM固有の問題ではなく、JavaScriptのJSON処理の標準仕様に起因するものです。

タグ: Node.js JSON Date UTC 時区処理

6月14日 16:41 投稿