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

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

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

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

JavaScript の Date は柔軟ですが、年初取得を正しく行うためには 「年を取り出す → 月を 0(1月)にする → 日付を 1 にする」 という基本を理解する必要があります。

ここでは、年初取得の基本から、実務で使えるテンプレートまでを 例題とコードを交えて丁寧に解説します。

年初取得の基本は「月を 0、日付を 1 に固定する」こと

JavaScript の Date は次のように現在日時を取得できます。

const now = new Date();
JavaScript

年初を求めるには、次の 3 ステップが基本です。

年初取得の基本ロジック

  1. 年を取り出す
  2. 月を 0(1月) にする
  3. 日付を 1 にする

コード例(基本形)

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

重要ポイント

  • 月は 0 始まりなので「1月=0」
  • 日付を「1」に固定するだけで年初になる
  • 時刻はそのまま残るが、年初取得では問題にならないことが多い

年初取得の例題

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

深掘りポイント

  • 年初は必ず「1月1日」なのでロジックが非常に安定する
  • 月初・月末よりもシンプルで、バグが起きにくい
  • 年次集計の基準日として使われることが多い

年初を「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 getYearStartYmd(date) {
  return formatYmd(getYearStart(date));
}
JavaScript

使用例

console.log(getYearStartYmd("2026-08-15"));
// → "2026-01-01"
JavaScript

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

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

前年初

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

翌年初

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

使用例

console.log(getPrevYearStart("2026-08-15")); // 2025-01-01
console.log(getNextYearStart("2026-08-15")); // 2027-01-01
JavaScript

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

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

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

  start(date) {
    const d = new Date(date);
    return new Date(d.getFullYear(), 0, 1);
  },

  startYmd(date) {
    const d = this.start(date);
    return `${d.getFullYear()}-${this.pad2(d.getMonth() + 1)}-${this.pad2(d.getDate())}`;
  },

  prevStart(date) {
    const d = new Date(date);
    return new Date(d.getFullYear() - 1, 0, 1);
  },

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

使用例

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

console.log(YearUtil.start("2026-08-15"));      // 2026-01-01
console.log(YearUtil.startYmd("2026-08-15"));   // "2026-01-01"
console.log(YearUtil.prevStart("2026-08-15"));  // 2025-01-01
console.log(YearUtil.nextStart("2026-08-15"));  // 2027-01-01
JavaScript

年初取得の“実務での落とし穴”を深掘りする

月は 0 始まりである(最重要)

new Date(2026, 0, 1); // 2026年1月1日
new Date(2026, 1, 1); // 2026年2月1日
JavaScript

初心者が最も間違えるポイントです。

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

new Date("2026/08/15"); // Safari で失敗する可能性あり
JavaScript

非標準形式はブラウザ差異が出るため、 ISO形式(YYYY-MM-DD)か手動パースを使うのが安全です。

時刻が残ると後続処理でズレることがある

年初取得では時刻は気にならないことが多いですが、 後続処理で「日付だけ比較したい」場合は時刻をリセットする必要があります。

d.setHours(0, 0, 0, 0);
JavaScript

年初取得を使った実務テンプレート

年次レポートの期間を求める

function getYearlyRange(date) {
  const start = YearUtil.start(date);
  const end = YearUtil.nextStart(date);
  return { start, end };
}

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

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

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

  records.forEach((r) => {
    const key = YearUtil.startYmd(r.date);
    if (!map.has(key)) map.set(key, []);
    map.get(key).push(r);
  });

  return map;
}
JavaScript

まとめ:年初取得は「年次処理のスタート地点を正確に定義する技術」

年初取得を正しく扱うためのポイントは次の通りです。

  • 年初は 1月1日であり、月は 0 始まり
  • 年初は「年を取り出して、月を 0、日付を 1 にする」だけで求められる
  • 前年初・翌年初は年を ±1 するだけで求められる
  • 文字列形式は ISO(YYYY-MM-DD)が安全
  • 業務ではユーティリティ化して再利用するのが最も安全

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

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