【超解説】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
上記の例では、date1
と date2
は同じ ISO 週 (2024 年の 25 週) に属しているため、true
が出力されます。
isSameISOWeek
関数の詳細
isSameISOWeek
関数は、2つの日付を引数として受け取り、以下の条件を満たす場合に true
を返します。
- 2つの日付が同じ ISO 週番号に属している
- 2つの日付が同じ年に属している
date-fns
ライブラリは、NPM でインストールできます。isSameISOWeek
関数は、時刻を考慮しません。つまり、2024-06-15T00:00:00
と2024-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
ライブラリには、他にも様々な日付操作関数を提供しています。詳細はドキュメントを参照してください。- 上記のコードはあくまで一例であり、状況に合わせて様々なバリエーションで利用できます。
代替方法
手動で比較する
最も単純な方法は、それぞれの
year
とISOWeek
を取得し、手動で比較することです。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; }
利点
- ライブラリに依存しない
- コードが冗長になる
- エラー処理が必要
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
関数とほぼ同じ使い方ができる- 豊富な日付操作機能を提供している
欠点
- 別途ライブラリをインストールする必要がある
Lodash を使用する
Lodash は、JavaScript のユーティリティライブラリです。
_.isEqual
関数を使用して、2つのオブジェクトの値を比較することができます。year
とISOWeek
をオブジェクトとして格納すれば、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 を既に利用している場合は、それぞれのライブラリの機能を活用する方が効率的です。
- シンプルな方法を求める場合は、手動で比較する方法がおすすめです。