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

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

年末取得は「1年の終わりを正確に定義するための重要ユーティリティ」

年初取得と並んで 年末取得(その年の12月31日を求める処理)は、業務システムで非常に多く使われます。 決算処理、年間レポート、年間集計、勤怠の年次計算、売上の年次分析など、 「この年の終わりはいつか?」を正確に求めることは、あらゆる年次ロジックの基盤です。

JavaScript の Date は柔軟ですが、年末取得を正しく行うためには 「翌年の年初から1日戻る」というテクニックを理解する必要があります。 この方法は月末取得のロジックと同じで、非常に強力です。

年末取得の基本は「翌年の年初から1日戻る」こと

JavaScript の Date は次のように扱えます。

new Date(year, month, day)
JavaScript

ここで重要なのは、 月は 0 始まり(1月=0、12月=11) という仕様です。

年末取得の黄金ルール

翌年の 1 月 1 日(=month=0)を作り、そこから day=0 を指定する。

これだけで、 12月31日を確実に取得できます。

コード例(基本形)

function getYearEnd(date) {
  const d = new Date(date);
  return new Date(d.getFullYear() + 1, 0, 0);
}
JavaScript

なぜ day=0 が「前月の月末」になるのか

JavaScript の Date は「日付が 0 の場合、前月の末日」として扱います。 この仕様を利用すると、年末取得が非常に簡単になります。

年末取得の例題

console.log(getYearEnd("2026-08-15"));
// → 2026-12-31T00:00:00.000Z(環境により表示は異なる)
JavaScript

深掘りポイント

  • 年末は必ず「12月31日」なのでロジックが安定する
  • うるう年でも年末は変わらないため、追加ロジック不要
  • 月末取得と同じ「day=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 getYearEndYmd(date) {
  return formatYmd(getYearEnd(date));
}
JavaScript

使用例

console.log(getYearEndYmd("2026-08-15"));
// → "2026-12-31"
JavaScript

前年末・翌年末も簡単に求められる

年末取得のロジックを応用すると、 前年末・翌年末も簡単に求められます。

前年末

function getPrevYearEnd(date) {
  const d = new Date(date);
  return new Date(d.getFullYear(), 0, 0);
}
JavaScript

翌年末

function getNextYearEnd(date) {
  const d = new Date(date);
  return new Date(d.getFullYear() + 2, 0, 0);
}
JavaScript

使用例

console.log(getPrevYearEnd("2026-08-15")); // 2025-12-31
console.log(getNextYearEnd("2026-08-15")); // 2027-12-31
JavaScript

年末取得ユーティリティ(業務で使えるテンプレート)

実務では、年末関連の処理をまとめておくと非常に便利です。

export const YearEndUtil = {
  pad2(n) {
    return String(n).padStart(2, "0");
  },

  end(date) {
    const d = new Date(date);
    return new Date(d.getFullYear() + 1, 0, 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(), 0, 0);
  },

  nextEnd(date) {
    const d = new Date(date);
    return new Date(d.getFullYear() + 2, 0, 0);
  },
};
JavaScript

使用例

import { YearEndUtil } from "./YearEndUtil.js";

console.log(YearEndUtil.end("2026-08-15"));      // 2026-12-31
console.log(YearEndUtil.endYmd("2026-08-15"));   // "2026-12-31"
console.log(YearEndUtil.prevEnd("2026-08-15"));  // 2025-12-31
console.log(YearEndUtil.nextEnd("2026-08-15"));  // 2027-12-31
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 getYearlyRange(date) {
  const start = new Date(date.getFullYear(), 0, 1);
  const end = YearEndUtil.end(date);
  return { start, end };
}

console.log(getYearlyRange("2026-08-15"));
// { start: 2026-01-01, end: 2026-12-31 }
JavaScript

年末をキーにした集計処理

function groupByYearEnd(records) {
  const map = new Map();

  records.forEach((r) => {
    const key = YearEndUtil.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をコピーしました