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

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

月初取得は「月のスタート地点を正確に取り出すための基盤ユーティリティ」

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

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)
JavaScript

2. 日付を「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);
JavaScript

3. 文字列形式によって結果が変わる

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

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

月初は毎月変わりますが、 その求め方はユーティリティで固定化できます。

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