如何根据工作日的开始日期、劳动力和预算工时返回预测日期



我正在尝试使用开始日期计算返回日期,一个工人团队每天可以工作多少小时(在本例中为 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;
 }

最新更新