【JavaScript】ISO週を取得する方法3選!「Dateオブジェクト」「moment.js」「date-fns」徹底比較


ISO 週とは、国際標準化機構 (ISO) で定められた、1 年間を 52 週に分割する方法です。この方法は、一般的に使用されている週番号付けとは異なる場合があります。

isThisISOWeek 関数の引数

  • date: 判定対象の日付を指定します。これは、Date オブジェクトまたは有効な日付文字列にする必要があります。

isThisISOWeek 関数の返り値

  • 指定された日付が現在の ISO 週に属している場合は true、そうでない場合は false を返します。

isThisISOWeek 関数の例

import { isThisISOWeek } from 'date-fns';

const today = new Date();

console.log(isThisISOWeek(today)); // true (今日が現在の ISO 週に属している場合)
  • isThisISOWeek 関数は、地域設定の影響を受けません。常に ISO 週に基づいて判定を行います。
  • isThisISOWeek 関数は、常に現在の時刻に基づいて判定を行います。そのため、同じ日付に対して異なる結果が返される可能性があります。
  • endOfISOWeek: 指定された日付の ISO 週の最後の日の日付を取得します。
  • startOfISOWeek: 指定された日付の ISO 週の最初の日の日付を取得します。
  • getISOWeek: 指定された日付の ISO 週番号を取得します。


import { isThisISOWeek } from 'date-fns';

const today = new Date();

console.log(isThisISOWeek(today)); // true (今日が現在の ISO 週に属している場合)

例 2: 過去の ISO 週に属しているかどうかを判定

import { isThisISOWeek, subDays } from 'date-fns';

const yesterday = subDays(new Date(), 1);

console.log(isThisISOWeek(yesterday)); // false (昨日が現在の ISO 週に属していない場合)

例 3: 未来の ISO 週に属しているかどうかを判定

import { isThisISOWeek, addDays } from 'date-fns';

const tomorrow = addDays(new Date(), 1);

console.log(isThisISOWeek(tomorrow)); // false (明日が現在の ISO 週に属していない場合)

例 4: 特定の日付が現在の ISO 週に属しているかどうかを判定

import { isThisISOWeek, parse } from 'date-fns';

const specificDate = parse('2024-05-25', 'yyyy-MM-dd');

console.log(isThisISOWeek(specificDate)); // true (2024-05-25 が現在の ISO 週に属している場合)

例 5: 特定の日付が過去の ISO 週に属しているかどうかを判定

import { isThisISOWeek, parse, subDays } from 'date-fns';

const specificDate = parse('2024-05-24', 'yyyy-MM-dd');
const yesterday = subDays(new Date(), 1);

console.log(isThisISOWeek(specificDate, yesterday)); // true (2024-05-24 が昨日の ISO 週に属している場合)

これらの例は、isThisISOWeek 関数の使い方を理解するのに役立つはずです。

  • isThisISOWeek 関数は、地域設定の影響を受けません。常に ISO 週に基づいて判定を行います。
  • isThisISOWeek 関数は、常に現在の時刻に基づいて判定を行います。そのため、同じ日付に対して異なる結果が返される可能性があります。
  • 上記のコードは、date-fns パッケージをインストールしていることを前提としています。


function getISOWeekNumber(date) {
  const year = date.getFullYear();
  const firstDayOfYear = new Date(year, 0, 1);
  const firstWeekOfYear = new Date(year, 0, 4);
  const dayOfWeek = firstDayOfYear.getDay();

  const dayOfYear = Math.floor((date - firstDayOfYear) / (86400000 * 7));
  const week = Math.ceil((dayOfYear + dayOfWeek) / 7);

  if (week === 0) {
    return week + 52;
  } else if (week === 1 && dayOfWeek === 0) {
    return week + 52;
  } else {
    return week;
  }
}

const today = new Date();
const isoWeekNumber = getISOWeekNumber(today);
console.log(isoWeekNumber); // 現在の ISO 週番号を出力

moment.js ライブラリを使用する

moment.js ライブラリを使用すると、より簡単に ISO 週番号を取得できます。

import moment from 'moment';

const today = moment();
const isoWeekNumber = today.isoWeek();
console.log(isoWeekNumber); // 現在の ISO 週番号を出力

date-fns ライブラリを使用する

date-fns ライブラリには、ISO 週番号を取得するための専用の関数があります。

import { getISOWeek } from 'date-fns';

const today = new Date();
const isoWeekNumber = getISOWeek(today);
console.log(isoWeekNumber); // 現在の ISO 週番号を出力

各方法の比較

  • date-fns ライブラリを使用する方法:date-fns ライブラリをインストールする必要がありますが、専用の関数があり、コードが最も読みやすくなります。
  • moment.js ライブラリを使用する方法:moment.js ライブラリをインストールする必要がありますが、コードは簡潔になります。
  • Date オブジェクトのメソッドを使用する方法:最もシンプルですが、少し複雑なロジックが必要になります。

どの方法を選択するかは、個人の好みやプロジェクトの要件によって異なります。

ISO 週は、一般的に使用されている週番号付けとは異なる場合があります。これは、ISO 週が 1 年間を 52 週に分割する一方、多くの地域では 52 週または 53 週に分割するためです。