Waka blog.

[JavaScript]Date#setMonthでの注意点

発生した問題

以下のような月末日取得の実装を行なっていた。

const date = new Date();
date.setMonth(date.getMonth() + 1);
date.setDate(0);
date.setHours(23, 59, 59, 999);
console.log(date)

setMonth で対象の月 + 1の月をセットし、 setDate(0) で前月の月末日をセット => 対象の月の月末日が求められるというロジックである。

基本的には正常に機能していたのだが、対象の日付が 2024-10-31 の場合に、 2024-11-30 が出力される不具合に遭遇した。

原因

setMonth の使用で、セットした月に存在しない日付だった場合、さらに + 1した月がセットされる。

今回のケースでは11月31日という存在しない日付となるため、自動的に12月に置き換えられていた。

そして、12月の状態で setDate(0) としたため前月の月末日、つまり 2024-11-30 が出力される結果となった。