Moment.jsやLuxonも駆使!JavaScriptでDateオブジェクトの年を操作する方法のまとめ


Date.setFullYear メソッドは、JavaScriptにおける Date オブジェクトの年を指定した値に変更します。オプションで月と日も調整できます。このメソッドは、過去や未来の日付を操作したり、特定の年の日付を取得したりする際に役立ちます。

構文

dateObject.setFullYear(yearValue, [monthValue], [dayValue]);

パラメータ

  • dayValue (オプション): 新しい日の数値 (1~31)。デフォルトは現在の月の日付
  • monthValue (オプション): 新しい月の数値 (0~11)。デフォルトは現在の月
  • yearValue: 対象となる年の数値

戻り値

変更された Date オブジェクト

// 現在の日付を取得
const currentDate = new Date();

// 年を2023に変更
currentDate.setFullYear(2023);
console.log(currentDate); // Wed Jul 03 2023 00:00:00 GMT-0700 (太平洋夏時間)

// 年を2023、月を5月に変更
currentDate.setFullYear(2023, 4);
console.log(currentDate); // Wed May 03 2023 00:00:00 GMT-0700 (太平洋夏時間)

// 年を2023、月を5月、日を10に変更
currentDate.setFullYear(2023, 4, 10);
console.log(currentDate); // Wed May 10 2023 00:00:00 GMT-0700 (太平洋夏時間)

注意点

  • このメソッドは、Date オブジェクトを変更します。新しい日付を取得したい場合は、変更後のオブジェクトを新しい変数に代入することをおすすめします。
  • monthValuedayValue を指定する場合は、yearValue と整合している必要があります。例えば、yearValue が 2020 で monthValue が 15 (12ヶ月を超える) の場合、yearValue は 2021 に自動的に更新されます。
  • yearValue が有効な範囲外の場合は、エラーが発生します。
  • 誕生日の日付を計算する
  • 特定の年のすべての日のループ処理を行う
  • 未来のある特定の日付を生成する
  • 過去のある特定の日付を生成する


特定の誕生日を生成する

function getBirthday(year, month, day) {
  const birthday = new Date();
  birthday.setFullYear(year, month - 1, day); // 月は 0 から始まることに注意
  return birthday;
}

const myBirthday = getBirthday(1980, 3, 14);
console.log(myBirthday); // Fri Mar 14 1980 00:00:00 GMT-0700 (太平洋夏時間)

特定の年のすべての日のループ処理

function loopThroughAllDaysInAYear(year) {
  const startDate = new Date(year, 0, 1); // 年の最初の日を取得
  const endDate = new Date(year, 11, 31); // 年の最後の日を取得

  for (let currentDate = startDate; currentDate <= endDate; currentDate.setDate(currentDate.getDate() + 1)) {
    console.log(currentDate);
  }
}

loopThroughAllDaysInAYear(2023);
function calculateDaysSinceDate(pastDate) {
  const oneDay = 24 * 60 * 60 * 1000; // 1日あたりのミリ秒数
  const today = new Date();
  const daysSince = Math.floor((today.getTime() - pastDate.getTime()) / oneDay);
  return daysSince;
}

const pastBirthday = new Date(1980, 2, 29); // 1980年3月29日
const daysSinceMyBirthday = calculateDaysSinceDate(pastBirthday);
console.log(`私の誕生日から現在までに経過した日数: ${daysSinceMyBirthday}`);


Date.UTC メソッドと Date.getUTCFullYear メソッドの組み合わせ

この方法は、協定世界時 (UTC) での年を操作する場合に有効です。

利点

  • コードが明確で読みやすい
  • UTCでのみ操作するため、夏時間などの影響を受けない

欠点

  • Date.setFullYear より若干処理速度が遅い可能性がある
  • ローカルタイムでの操作には不向き

const utcDate = new Date(Date.UTC(2023, 4, 10)); // 2023年5月10日 UTC
console.log(utcDate.getUTCFullYear()); // 2023

utcDate.setUTCFullYear(2024);
console.log(utcDate.getUTCFullYear()); // 2024

ミリ秒単位のタイムスタンプを使用する

この方法は、精度が最も高い方法ですが、コードが冗長になる可能性があります。

利点

  • タイムゾーンの影響を受けない
  • 最も精度が高い

欠点

  • 他の方法よりも処理速度が遅い
  • コードが冗長で読みづらい

const timestamp = new Date(2023, 4, 10).getTime();
const targetYear = 2024;

const newTimestamp = timestamp + (targetYear - 2023) * 365 * 24 * 60 * 60 * 1000; // 1年分のミリ秒数を加算
const newDate = new Date(newTimestamp);
console.log(newDate.getFullYear()); // 2024

ライブラリを使用する

Moment.js や Luxon などのライブラリは、Date オブジェクトを操作するための便利な機能を提供しています。これらのライブラリには、setFullYear メソッドに代わるより高度なメソッドが含まれている場合があります。

利点

  • コードが簡潔になる場合がある
  • 多くの便利な機能を提供

欠点

  • 標準の Date オブジェクトよりも習得に時間がかかる
  • ライブラリの追加読み込みが必要
const moment = require('moment');

const myDate = moment('2023-05-10');
myDate.setYear(2024);
console.log(myDate.format('YYYY')); // 2024