我正在尝试使用开始日期计算返回日期,一个工人团队每天可以工作多少小时(在本例中为 16 个劳动力小时)以及分配给项目的总预算小时数跳过周六和周日。
下面是一个计算这些小时数的工作函数,但是,它不会使用过多的预算小时数 (5000+) 为返回日期运行
function projectionDate($Date, $Budget_Hours) {
if (date('l', $Date->format("Y-m-d")) == 'Saturday'
|| date('l', $Date->format("Y-m-d")) == 'Sunday') {
return projectionDate($Date->add(new DateInterval('P1D')));
}
if ($Budget_Hours <= 16) {
return $Date->format("Y-m-d");
} else {
return projectionDate($Date->add(new DateInterval('P1D')), $Budget_Hours - 16);
}
}
回显投影日期(新日期时间('2017-10-26', '1000')
日
2017年12月27
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;
}