たとえば、今日は月曜日(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日が週末の場合、平日の削減には削減がカウントされません。
要件を満たすために営業日数を減らし続けます。
以下は、指定された日付から始まり、指定された就業日の数を差し引き、週末をスキップするサンプル関数を減算します。
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を直接使用して日数を差し引く場合、週末が含まれる場合があり、その結果、ビジネスロジックエラーが発生します。
営業日であるかどうかを循環的に判断し、就業日にのみカウントが減少するかどうかを決定することにより、就業日を減らすという要件を正確に実現できます。
この方法はシンプルで効率的であり、就業日の計算を必要とするほとんどのシナリオに適しています。