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

2024-06-13

date-fns の Day Helpers における differenceInBusinessDays 関数の詳細解説

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

以下の例は、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 関数の詳細については、公式ドキュメントを参照してください。


      "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" 関数よりも柔軟なカスタムロジックが必要となる場合があります。例えば、以下のような場合が考えられます。

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

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

        最適な方法の選択

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

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