function projectionDate($Date, $Budget_Hours, $Workforce_Hours = 8, $Holidays = array()){
$oneDayDateInterval = new DateInterval('P1D');
while($Budget_Hours > $Workforce_Hours || in_array($Date->format('Y-m-d'),$Holidays)){
if($Date->format("N") < 6 && !in_array($Date->format('Y-m-d'), $Holidays)){
$Budget_Hours -= $Workforce_Hours;
}
$Date = $Date->add($oneDayDateInterval);
}
return $Date->format("Y-m-d");
}
ここも米国連邦休日を行うための怠惰な方法です。ホーそれは今年だけを処理するため、プロデューサーの日付を後退させます。再帰を使用して
function getHolidaysThisYear($Holidays = array()){
$oneDayDateInterval = new DateInterval('P1D');
$MartinLutherKing = new DateTime(date("Y")."-01-15");
while($MartinLutherKing->format("l") != "Monday"){$MartinLutherKing->add($oneDayDateInterval);}
$WashingtonBirthday = new DateTime(date("Y")."-02-15");
while($WashingtonBirthday->format("l") != "Monday"){$WashingtonBirthday->add($oneDayDateInterval);}
$MemorialDay = new DateTime(date("Y")."-05-25");
while($MemorialDay->format("l") != "Monday"){$MemorialDay->add($oneDayDateInterval);}
$LaborDay = new DateTime(date("Y")."-09-01");
while($LaborDay->format("l") != "Monday"){$LaborDay->add($oneDayDateInterval);}
$ColombusDay = new DateTime(date("Y")."-10-08");
while($ColombusDay->format("l") != "Monday"){$ColombusDay->add($oneDayDateInterval);}
$ThanksGiving = new DateTime(date("Y")."-11-22");
while($ThanksGiving->format("l") != "Thursday"){$ThanksGiving->add($oneDayDateInterval);}
$Holidays = array_merge($Holidays,array(date("Y") . "-01-01",date("Y") . "-06-04",date("Y") . "-11-11",date("Y"). "-12-25",$MartinLutherKing->format("Y-m-d"),$WashingtonBirthday->format("Y-m-d"),$MemorialDay->format("Y-m-d"),$LaborDay->format("Y-m-d"),$ColombusDay->format("Y-m-d"),$ThanksGiving->format("Y-m-d")));
return $Holidays;
}
は、この場合には適切ではありません。あまりにも多くのメモリを使用しており、再帰呼び出しが多すぎます。 https://stackoverflow.com/questions/336127/calculate-business-daysのような別の方法をお試しください。利用可能なすべてのソリューション、特に休日を考慮したソリューションを検討することを強くお勧めします。 – Dimi
フォーマット指定子 'N'は、日曜日の月曜日〜7日に1を与えます。したがって、' N <6'をチェックするだけで週末はスキップします。必要な勤務時間に達するまで、一度にDateTimeオブジェクトに1日追加するだけで、ループを継続してください。国/祝祭日も考慮したい場合は、始めに簡単にするために、いくつかのウェブサイト(コピー&ペースト)から関連データを取得し、次の2年間の日付を配列を単純な 'yyyy-mm-dd'形式で作成し、in_arrayを使用して同じ形式の現在のループ日付をチェックします。動作してはならない - - – CBroe