月末取得は「月の終わりを正確に求めるための必須ユーティリティ」
月初取得と並んで 月末取得(月の最後の日付を求める処理)は、業務システムで非常に多く使われます。 請求書の締め処理、月次レポート、勤怠の集計、売上の月次分析など、 「この月の終わりはいつか?」を正確に求めることは、ほぼすべての月次ロジックの基盤です。
JavaScript の Date は柔軟ですが、月は 0 始まりであることや、 月末を求めるときに「翌月の月初から1日戻る」というテクニックを知らないと、 初心者はつまずきやすいです。
ここでは、月末取得の基本から、実務で使えるテンプレートまでを 例題とコードを交えて丁寧に解説します。
月末取得の基本は「翌月の月初から1日戻る」こと
JavaScript で月末を求める最も安全で確実な方法は次のロジックです。
月末取得の黄金ルール
翌月の月初を作り、そこから1日戻す。
これだけで、 31日・30日・29日・28日など、月によって異なる月末を確実に求められます。
コード例(基本形)
function getMonthEnd(date) {
const d = new Date(date);
return new Date(d.getFullYear(), d.getMonth() + 1, 0);
}
JavaScriptなぜ day=0 が「前月の月末」になるのか
JavaScript の Date は「日付が 0 の場合、前月の末日」として扱います。 これは公式仕様であり、業務ロジックで非常に便利な性質です。
月末取得の例題
console.log(getMonthEnd("2026-02-10")); // 2026-02-28(うるう年でない)
console.log(getMonthEnd("2024-02-10")); // 2024-02-29(うるう年)
console.log(getMonthEnd("2026-08-15")); // 2026-08-31
JavaScript深掘りポイント
- 月末は月によって異なるため「固定値で扱う」のは危険
new Date(year, month + 1, 0)なら自動で正しい月末になる- うるう年も自動判定されるため、追加ロジック不要
月末を「yyyy-mm-dd」形式で返すユーティリティ
業務では「月末を文字列で返す」場面が非常に多いです。 レポート、ログ、API パラメータなど、文字列形式が求められることが多いためです。
function pad2(n) {
return String(n).padStart(2, "0");
}
function formatYmd(date) {
return `${date.getFullYear()}-${pad2(date.getMonth() + 1)}-${pad2(date.getDate())}`;
}
function getMonthEndYmd(date) {
return formatYmd(getMonthEnd(date));
}
JavaScript使用例
console.log(getMonthEndYmd("2026-08-15"));
// → "2026-08-31"
JavaScript前月末・翌月末も簡単に求められる
月末取得のロジックを応用すると、 前月末・翌月末も簡単に求められます。
前月末
function getPrevMonthEnd(date) {
const d = new Date(date);
return new Date(d.getFullYear(), d.getMonth(), 0);
}
JavaScript翌月末
function getNextMonthEnd(date) {
const d = new Date(date);
return new Date(d.getFullYear(), d.getMonth() + 2, 0);
}
JavaScript使用例
console.log(getPrevMonthEnd("2026-08-15")); // 2026-07-31
console.log(getNextMonthEnd("2026-08-15")); // 2026-09-30
JavaScript月末取得ユーティリティ(業務で使えるテンプレート)
実務では、月末関連の処理をまとめておくと非常に便利です。
export const MonthEndUtil = {
pad2(n) {
return String(n).padStart(2, "0");
},
end(date) {
const d = new Date(date);
return new Date(d.getFullYear(), d.getMonth() + 1, 0);
},
endYmd(date) {
const d = this.end(date);
return `${d.getFullYear()}-${this.pad2(d.getMonth() + 1)}-${this.pad2(d.getDate())}`;
},
prevEnd(date) {
const d = new Date(date);
return new Date(d.getFullYear(), d.getMonth(), 0);
},
nextEnd(date) {
const d = new Date(date);
return new Date(d.getFullYear(), d.getMonth() + 2, 0);
},
};
JavaScript使用例
import { MonthEndUtil } from "./MonthEndUtil.js";
console.log(MonthEndUtil.end("2026-08-15")); // 2026-08-31
console.log(MonthEndUtil.endYmd("2026-08-15")); // "2026-08-31"
console.log(MonthEndUtil.prevEnd("2026-08-15")); // 2026-07-31
console.log(MonthEndUtil.nextEnd("2026-08-15")); // 2026-09-30
JavaScript月末取得の“実務での落とし穴”を深掘りする
月は 0 始まりである(最重要)
new Date(2026, 0, 0); // 2025-12-31
new Date(2026, 1, 0); // 2026-01-31
JavaScript初心者が最も間違えるポイントです。
文字列形式によって結果が変わる
new Date("2026/08/15"); // Safari で失敗する可能性あり
JavaScript非標準形式はブラウザ差異が出るため、 ISO形式(YYYY-MM-DD)か手動パースを使うのが安全です。
時刻が残ると後続処理でズレることがある
月末取得では時刻は気にならないことが多いですが、 後続処理で「日付だけ比較したい」場合は時刻をリセットする必要があります。
d.setHours(0, 0, 0, 0);
JavaScript月末取得を使った実務テンプレート
月次レポートの期間を求める
function getMonthlyRange(date) {
const start = new Date(date.getFullYear(), date.getMonth(), 1);
const end = MonthEndUtil.end(date);
return { start, end };
}
JavaScript月末をキーにした集計処理
function groupByMonthEnd(records) {
const map = new Map();
records.forEach((r) => {
const key = MonthEndUtil.endYmd(r.date);
if (!map.has(key)) map.set(key, []);
map.get(key).push(r);
});
return map;
}
JavaScriptまとめ:月末取得は「月次処理の終点を正確に定義する技術」
月末取得を正しく扱うためのポイントは次の通りです。
- 月末は 翌月の月初から1日戻ることで確実に求められる
- 月は 0 始まりである
- うるう年も自動判定されるため追加ロジック不要
- 文字列形式は ISO(YYYY-MM-DD)が安全
- 業務ではユーティリティ化して再利用するのが最も安全
月次処理は業務システムの中心にある機能です。 その基盤となる月末取得をユーティリティ化しておくことで、 どの場面でも安定したロジックが書けるようになります。
