【超解説】date-fnsの「isSameISOWeek」を徹底理解!サンプルコードで分かりやすく解説


isSameISOWeek 関数は、date-fns ライブラリが提供する便利な機能の一つです。これは、2つの日付が同じ ISO 週に属しているかどうかを判断するために使用されます。

ISO 週とは

ISO 週とは、国際標準化機構 (ISO) で定義された週の表記方法です。一般的に使用されている週とは異なり、1 年の最初の週は、1 月 4 日を含む週から始まります。また、閏年は 53 週ある場合があります。

isSameISOWeek 関数の使い方

import { isSameISOWeek } from 'date-fns';

const date1 = new Date('2024-06-15');
const date2 = new Date('2024-06-22');

const isSameWeek = isSameISOWeek(date1, date2);
console.log(isSameWeek); // true

上記の例では、date1date2 は同じ ISO 週 (2024 年の 25 週) に属しているため、true が出力されます。

isSameISOWeek 関数の詳細

isSameISOWeek 関数は、2つの日付を引数として受け取り、以下の条件を満たす場合に true を返します。

  • 2つの日付が同じ ISO 週番号に属している
  • 2つの日付が同じ年に属している
  • date-fns ライブラリは、NPM でインストールできます。
  • isSameISOWeek 関数は、時刻を考慮しません。つまり、2024-06-15T00:00:002024-06-15T23:59:59 は同じ ISO 週に属していると判断されます。
npm install date-fns


import { isSameISOWeek } from 'date-fns';

const date1 = new Date('2024-06-15'); // 2024年6月15日
const targetDate = new Date('2024-06-22'); // 2024年6月22日

const isSameWeek = isSameISOWeek(date1, targetDate);
console.log(isSameWeek); // true

複数の比較を行う

import { isSameISOWeek } from 'date-fns';

const date1 = new Date('2024-06-15'); // 基準となる日付
const dates = [
  new Date('2024-06-10'), // 同じ週
  new Date('2024-06-22'), // 同じ週
  new Date('2024-06-29'), // 異なる週
  new Date('2024-07-06'), // 異なる週
];

for (const date of dates) {
  const isSameWeek = isSameISOWeek(date1, date);
  console.log(`${date.toISOString()} is in the same ISO week as ${date1.toISOString()}: ${isSameWeek}`);
}

特定の期間内に同じ ISO 週の日付を見つける

import { isSameISOWeek, getISOWeek } from 'date-fns';

const startDate = new Date('2024-06-01'); // 期間の開始日
const endDate = new Date('2024-06-30'); // 期間の終了日

const sameWeekDates = [];

for (let currentDate = startDate; currentDate <= endDate; currentDate = new Date(currentDate.getTime() + 86400000)) { // 1日ずつ進める
  const currentWeek = getISOWeek(currentDate);

  if (sameWeekDates.length === 0 || !isSameISOWeek(currentDate, sameWeekDates[sameWeekDates.length - 1])) {
    sameWeekDates.push(currentDate);
  }
}

console.log(sameWeekDates); // 同じ ISO 週の日付のリスト
import { getISOWeekStart, getISOWeekEnd } from 'date-fns';

const targetISOWeek = 25; // 対象となる ISO 週番号

const weekStart = getISOWeekStart(new Date(), { weekStartsOn: 1 }); // 現在の週の開始日
const weekEnd = getISOWeekEnd(weekStart, { weekStartsOn: 1 }); // 現在の週の終了日

if (getISOWeek(weekStart) === targetISOWeek) {
  console.log(`ISO week ${targetISOWeek} starts on ${weekStart.toISOString()} and ends on ${weekEnd.toISOString()}`);
} else {
  const targetWeekStart = getISOWeekStart(new Date(), { weekStartsOn: 1, week: targetISOWeek });
  const targetWeekEnd = getISOWeekEnd(targetWeekStart, { weekStartsOn: 1, week: targetISOWeek });
  console.log(`ISO week ${targetISOWeek} starts on ${targetWeekStart.toISOString()} and ends on ${targetWeekEnd.toISOString()}`);
}
  • date-fns ライブラリには、他にも様々な日付操作関数を提供しています。詳細はドキュメントを参照してください。
  • 上記のコードはあくまで一例であり、状況に合わせて様々なバリエーションで利用できます。


代替方法

  1. 手動で比較する

    最も単純な方法は、それぞれの yearISOWeek を取得し、手動で比較することです。

    function isSameISOWeekManual(date1, date2) {
      const year1 = date1.getFullYear();
      const year2 = date2.getFullYear();
      const isoWeek1 = getISOWeek(date1);
      const isoWeek2 = getISOWeek(date2);
    
      return year1 === year2 && isoWeek1 === isoWeek2;
    }
    

    利点

    • ライブラリに依存しない
    • コードが冗長になる
    • エラー処理が必要
  2. Moment.js を使用する

    Moment.js は、日付操作に特化した JavaScript ライブラリです。isSameISOWeek 関数と同様の機能を提供しているため、代替として使用できます。

    import moment from 'moment';
    
    const date1 = new Date('2024-06-15');
    const date2 = new Date('2024-06-22');
    
    const isSameWeek = moment(date1).isSame(date2, 'isoWeek');
    console.log(isSameWeek); // true
    

    利点

    • isSameISOWeek 関数とほぼ同じ使い方ができる
    • 豊富な日付操作機能を提供している

    欠点

    • 別途ライブラリをインストールする必要がある
  3. Lodash を使用する

    Lodash は、JavaScript のユーティリティライブラリです。_.isEqual 関数を使用して、2つのオブジェクトの値を比較することができます。yearISOWeek をオブジェクトとして格納すれば、isSameISOWeek 関数と同様の機能を実現できます。

    import _ from 'lodash';
    
    const date1 = new Date('2024-06-15');
    const date2 = new Date('2024-06-22');
    
    const isSameWeek = _.isEqual({ year: date1.getFullYear(), isoWeek: getISOWeek(date1) },
                                { year: date2.getFullYear(), isoWeek: getISOWeek(date2) });
    console.log(isSameWeek); // true
    

    利点

    • _.isEqual 関数を使用して、様々なオブジェクトの比較が可能

    欠点

    • 別途ライブラリをインストールする必要がある

選択の指針

どの代替方法を選択するかは、状況によって異なります。

  • ライブラリへの依存を避けたい場合は、手動で比較する方法が唯一の選択肢となります。
  • Moment.js や Lodash を既に利用している場合は、それぞれのライブラリの機能を活用する方が効率的です。
  • シンプルな方法を求める場合は、手動で比較する方法がおすすめです。