月初取得は「月のスタート地点を正確に取り出すための基盤ユーティリティ」
日付・時間ユーティリティの中でも 月初取得(月の最初の日付を求める処理)は、業務システムで非常に多く使われます。 請求書の締め処理、月次レポート、勤怠の集計、売上の月次分析など、 「この月の開始日はいつか?」を正確に求めることは、ほぼすべての業務ロジックの基盤になります。
JavaScript の Date は柔軟ですが、月は 0 始まりであることや、時刻が残ると計算がズレるなど、初心者がつまずきやすいポイントがあります。 ここでは、月初取得の基本から、実務で使えるテンプレートまでを、例題とコードを交えて丁寧に解説します。
月初取得の基本は「日付を 1 日に固定する」こと
JavaScript の Date は次のように現在日時を取得できます。
const now = new Date();
JavaScript月初を求めるには、次の 2 ステップが基本です。
1. 年と月を取り出す
const year = now.getFullYear();
const month = now.getMonth(); // 0〜11(1月が0)
JavaScript2. 日付を「1」に固定して新しい Date を作る
const firstDay = new Date(year, month, 1);
JavaScriptこれで「その月の月初」が得られます。
月初取得ユーティリティ(最小構成)
まずは最もシンプルで実務でも使える形を紹介します。
function getMonthStart(date) {
const d = new Date(date);
return new Date(d.getFullYear(), d.getMonth(), 1);
}
JavaScript使い方は次の通りです。
console.log(getMonthStart("2026-08-15"));
// → 2026-08-01T00:00:00.000Z(環境により表示は異なる)
JavaScript重要ポイント
- 月は 0 始まりなので
getMonth()をそのまま使ってよい - 日付を「1」に固定するだけで月初になる
- 時刻はそのまま残るが、月初取得では問題にならないことが多い
月初を「yyyy-mm-dd」形式で返すユーティリティ
業務では「月初を文字列で返す」場面が非常に多いです。 レポート、ログ、API パラメータなど、文字列形式が求められることが多いためです。
function formatYmd(date) {
const pad2 = (n) => String(n).padStart(2, "0");
const y = date.getFullYear();
const m = pad2(date.getMonth() + 1);
const d = pad2(date.getDate());
return `${y}-${m}-${d}`;
}
function getMonthStartYmd(date) {
return formatYmd(getMonthStart(date));
}
JavaScript使い方は次の通りです。
console.log(getMonthStartYmd("2026-08-15"));
// → "2026-08-01"
JavaScript深掘りポイント
- 月初は必ず「1日」なのでフォーマットが安定する
- ゼロ埋め(padStart)があることで文字列比較が可能になる
- 業務ロジックで「月初をキーにする」場面が多い
月初取得の応用:前月・翌月の月初を求める
月次処理では「前月の月初」「翌月の月初」が必要になることが多いです。
前月の月初
function getPrevMonthStart(date) {
const d = new Date(date);
return new Date(d.getFullYear(), d.getMonth() - 1, 1);
}
JavaScript翌月の月初
function getNextMonthStart(date) {
const d = new Date(date);
return new Date(d.getFullYear(), d.getMonth() + 1, 1);
}
JavaScript使い方は次の通りです。
console.log(getPrevMonthStart("2026-08-15")); // 2026-07-01
console.log(getNextMonthStart("2026-08-15")); // 2026-09-01
JavaScript深掘りポイント
getMonth()は 0〜11 の範囲だが、範囲外を指定しても自動で補正される- 例:月が -1 → 前年の 12 月
- 例:月が 12 → 翌年の 1 月
- この仕様を利用すると「前月・翌月の月初」が簡単に求められる
月初取得ユーティリティ(業務で使えるテンプレート)
実務では、月初関連の処理をまとめておくと非常に便利です。
export const MonthUtil = {
start(date) {
const d = new Date(date);
return new Date(d.getFullYear(), d.getMonth(), 1);
},
startYmd(date) {
const d = this.start(date);
const pad2 = (n) => String(n).padStart(2, "0");
return `${d.getFullYear()}-${pad2(d.getMonth() + 1)}-${pad2(d.getDate())}`;
},
prevStart(date) {
const d = new Date(date);
return new Date(d.getFullYear(), d.getMonth() - 1, 1);
},
nextStart(date) {
const d = new Date(date);
return new Date(d.getFullYear(), d.getMonth() + 1, 1);
},
};
JavaScript使い方は次の通りです。
import { MonthUtil } from "./MonthUtil.js";
console.log(MonthUtil.start("2026-08-15")); // 2026-08-01
console.log(MonthUtil.startYmd("2026-08-15")); // "2026-08-01"
console.log(MonthUtil.prevStart("2026-08-15")); // 2026-07-01
console.log(MonthUtil.nextStart("2026-08-15")); // 2026-09-01
JavaScript月初取得の“実務での落とし穴”を深掘りする
1. 月は 0 始まりである(最重要)
new Date(2026, 0, 1); // 2026年1月1日
new Date(2026, 1, 1); // 2026年2月1日
JavaScript初心者が最も間違えるポイントです。
2. 時刻が残ると後続処理でズレることがある
月初取得では時刻は気にならないことが多いですが、 後続処理で「日付だけ比較したい」場合は時刻をリセットする必要があります。
d.setHours(0, 0, 0, 0);
JavaScript3. 文字列形式によって結果が変わる
new Date("2026/08/15"); // Safari で失敗する可能性あり
JavaScript非標準形式はブラウザ差異が出るため、 ISO形式(YYYY-MM-DD)か手動パースを使うのが安全です。
月初取得を使った実務テンプレート
月次レポートの期間を求める
function getMonthlyRange(date) {
const start = MonthUtil.start(date);
const end = MonthUtil.nextStart(date);
return { start, end };
}
console.log(getMonthlyRange("2026-08-15"));
// { start: 2026-08-01, end: 2026-09-01 }
JavaScript月初をキーにした集計処理
function groupByMonth(records) {
const map = new Map();
records.forEach((r) => {
const key = MonthUtil.startYmd(r.date);
if (!map.has(key)) map.set(key, []);
map.get(key).push(r);
});
return map;
}
JavaScriptまとめ:月初取得は「月次処理のすべての基盤」
月初取得を正しく扱うためのポイントは次の通りです。
- 月は 0 始まりである
- 月初は「日付を 1 に固定する」だけで求められる
- 前月・翌月は月を ±1 するだけで求められる
- 文字列形式は ISO(YYYY-MM-DD)が安全
- 業務ではユーティリティ化して再利用するのが最も安全
月次処理は業務システムの中心にある機能です。 その基盤となる月初取得をユーティリティ化しておくことで、 どの場面でも安定したロジックが書けるようになります。
月初は毎月変わりますが、 その求め方はユーティリティで固定化できます。
