現在の位置: ホーム> 最新記事一覧> date_sub関数を使用して平日を差し引く:週末を避ける方法

date_sub関数を使用して平日を差し引く:週末を避ける方法

gitbox 2025-05-28

なぜ日数を短縮するのが間違いを犯すのですか?

たとえば、今日は月曜日(2025-05-26)であると仮定して、3営業日を差し引く必要があります。直接使用する場合:

 $date = new DateTime('2025-05-26');
$date->sub(new DateInterval('P3D')); // マイナス3空
echo $date->format('Y-m-d');

結果は2025-05-23(金曜日)であり、これは正しいと思われます。しかし、開始日が月曜日であり、減算日が大きい場合、土曜日と日曜日が含まれ、計算結果は逸脱します。


ソリューションのアイデア

  1. サイクル削減日:削減の毎日について、最初に1日が週末(土曜日か日曜日か)かを決定します。

  2. 週末のスキップ:1日が週末の場合、平日の削減には削減がカウントされません。

  3. 要件を満たすために営業日数を減らし続けます


コードの例

以下は、指定された日付から始まり、指定された就業日の数を差し引き、週末をスキップするサンプル関数を減算します。

 function subtractWorkingDays(DateTime $date, int $days): DateTime {
    $result = clone $date; // クローニングは、元のオブジェクトの変更を避けます
    while ($days > 0) {
        $result->sub(new DateInterval('P1D')); // 每次减少一空
        $weekday = (int)$result->format('N'); // 1 (月曜日に) 到着 7 (日曜日)
        if ($weekday < 6) { // 只有月曜日に到着周五才算作工作日
            $days--;
        }
    }
    return $result;
}

// 使用の例
$startDate = new DateTime('2025-05-26');
$workDaysToSubtract = 3;

$newDate = subtractWorkingDays($startDate, $workDaysToSubtract);
echo $newDate->format('Y-m-d'); // 出力の結果は次のとおりです2025-05-21,週末を正しくスキップします

分析

  • フォーマット( 'n')を使用して週番号を取得します。1は月曜日、7は日曜日です。

  • $日数は、1日が営業日(1〜5)の場合にのみ減少します。

  • ループすることにより、差し引かれた日数が純粋に営業日であることを確認してください。


要約します

  • date_subを直接使用して日数を差し引く場合、週末が含まれる場合があり、その結果、ビジネスロジックエラーが発生します。

  • 営業日であるかどうかを循環的に判断し、就業日にのみカウントが減少するかどうかを決定することにより、就業日を減らすという要件を正確に実現できます。

  • この方法はシンプルで効率的であり、就業日の計算を必要とするほとんどのシナリオに適しています。