JavaScript Tips | 日付・時間ユーティリティ:月末取得

JavaScript JavaScript
スポンサーリンク
スポンサーリンク

月末取得は「月の終わりを正確に求めるための必須ユーティリティ」

月初取得と並んで 月末取得(月の最後の日付を求める処理)は、業務システムで非常に多く使われます。 請求書の締め処理、月次レポート、勤怠の集計、売上の月次分析など、 「この月の終わりはいつか?」を正確に求めることは、ほぼすべての月次ロジックの基盤です。

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)が安全
  • 業務ではユーティリティ化して再利用するのが最も安全

月次処理は業務システムの中心にある機能です。 その基盤となる月末取得をユーティリティ化しておくことで、 どの場面でも安定したロジックが書けるようになります。

タイトルとURLをコピーしました