Pythonで「営業日数」をスマートに計算!differenceInBusinessDaysの代替方法3選


differenceInBusinessDays 関数は、2つの日付の間にある 営業日数 を計算します。これは、土日祝日を除いた日数を算出するもので、ビジネスシーンにおける日付計算に役立ちます。

使い方

import { differenceInBusinessDays } from 'date-fns';

const startDate = new Date(2024, 5, 13); // 2024年6月13日(月)
const endDate = new Date(2024, 5, 20); // 2024年6月20日(金)

const businessDays = differenceInBusinessDays(endDate, startDate);
console.log(businessDays); // 5 (月、火、水、木、金)

詳細

  • differenceInBusinessDays は、開始日を含み、終了日を除いた 日数です。
  • 計算には以下のルールが適用されます。
    • 土曜日と日曜日は除外されます。
    • 日本の祝日は除外されます。
    • オプションで、options オブジェクトを使用して除外する祝日をカスタマイズできます。
  • 戻り値は、2つの日付間にある 営業日数 です。
  • differenceInBusinessDays は、2つの Date オブジェクトを引数として受け取ります。

以下の例は、2024年6月13日から2024年6月20日までの間の営業日数を計算します。

import { differenceInBusinessDays } from 'date-fns';

const startDate = new Date(2024, 5, 13); // 2024年6月13日(月)
const endDate = new Date(2024, 5, 20); // 2024年6月20日(金)

const businessDays = differenceInBusinessDays(endDate, startDate);
console.log(businessDays); // 5 (月、火、水、木、金)

オプション

differenceInBusinessDays 関数は、オプションで options オブジェクトを受け取ることができます。このオブジェクトを使用して、除外する祝日をカスタマイズできます。

import { differenceInBusinessDays } from 'date-fns';

const startDate = new Date(2024, 5, 13); // 2024年6月13日(月)
const endDate = new Date(2024, 5, 20); // 2024年6月20日(金)

const options = {
  holidays: ['2024-06-19'] // 6月19日は祝日として除外
};

const businessDays = differenceInBusinessDays(endDate, startDate, options);
console.log(businessDays); // 4 (月、火、水、木)
  • differenceInBusinessDays 関数は、JavaScript で日付処理を行う際に役立つツールです。ビジネスシーンにおける日付計算に活用しましょう。
  • 本解説にて説明していない機能やオプションについては、公式ドキュメントを参照してください。


import { differenceInBusinessDays } from 'date-fns';

const startDate = new Date(2024, 5, 13); // 2024年6月13日(月)
const endDate = new Date(2024, 5, 20); // 2024年6月20日(金)

const businessDays = differenceInBusinessDays(endDate, startDate);
console.log(businessDays); // 5 (月、火、水、木、金)

オプションで祝日を指定

import { differenceInBusinessDays } from 'date-fns';

const startDate = new Date(2024, 5, 13); // 2024年6月13日(月)
const endDate = new Date(2024, 5, 20); // 2024年6月20日(金)

const options = {
  holidays: ['2024-06-19'] // 6月19日は祝日として除外
};

const businessDays = differenceInBusinessDays(endDate, startDate, options);
console.log(businessDays); // 4 (月、火、水、木)
import { differenceInBusinessDays } from 'date-fns';

const startDate = new Date(2024, 5, 13); // 2024年6月13日(月)
const endDate = new Date(2024, 5, 20); // 2024年6月20日(金)

const options = {
  weekdayCount: 1 // 月曜日のみカウント
};

const businessDays = differenceInBusinessDays(endDate, startDate, options);
console.log(businessDays); // 3 (月、月、月)
  • differenceInBusinessDays 関数の詳細については、公式ドキュメントを参照してください。
  • 上記のコードはあくまで一例です。ご自身の必要に合わせてカスタマイズしてください。


手動計算

比較的単純な場合、手動で計算することも可能です。以下の手順に従って、2つの日付間にある営業日数を算出できます。

  1. 開始日から終了日までのすべての日にちをループします。
  2. 各日にちが土曜日または日曜日でないか、日本の祝日でないかを判定します。
  3. 上記の条件を満たす日数をカウントします。

以下のコードは、手動計算の例です。

function differenceInBusinessDays(startDate, endDate) {
  let businessDays = 0;
  for (let day = startDate; day <= endDate; day = addDays(day, 1)) {
    if (!isWeekend(day) && !isJapaneseHoliday(day)) {
      businessDays++;
    }
  }
  return businessDays;
}

function isWeekend(date) {
  const day = date.getDay();
  return day === 0 || day === 6;
}

function isJapaneseHoliday(date) {
  // 日本の祝日判定ロジックを実装
}

function addDays(date, days) {
  const newDate = new Date(date.getTime());
  newDate.setDate(date.getDate() + days);
  return newDate;
}

date-fns 以外にも、日付処理に役立つライブラリは多数存在します。例えば、以下のようなライブラリが考えられます。

これらのライブラリには、"differenceInBusinessDays" と同様の機能を提供しているものがあります。

業務ロジックに合わせたカスタムロジック

具体的な業務ロジックによっては、"differenceInBusinessDays" 関数よりも柔軟なカスタムロジックが必要となる場合があります。例えば、以下のような場合が考えられます。

  • 開始日または終了日が営業時間外の場合の処理
  • 特定の企業独自の祝日を考慮したい場合
  • 特定の曜日のみ営業日としてカウントしたい場合

このような場合は、独自のカスタムロジックを開発する必要があります。

最適な方法の選択

どの方法が最適かは、状況によって異なります。以下の点を考慮して、最適な方法を選択してください。

  • 保守性
  • 開発時間
  • 必要な機能
  • 処理の複雑さ