Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何根据开始日期、员工人数和工作日的预算小时数返回预测日期?_Php_Datetime - Fatal编程技术网

Php 如何根据开始日期、员工人数和工作日的预算小时数返回预测日期?

Php 如何根据开始日期、员工人数和工作日的预算小时数返回预测日期?,php,datetime,Php,Datetime,我试图使用开始日期计算返回日期,在这种情况下,一组工人每天可以工作多少小时16个工作小时,以及跳过周六和周日分配给项目的总预算小时数 下面是一个计算这些小时数的工作函数,但是,对于使用过多预算小时数的返回日期,它不会运行+ function projectionDate($Date, $Budget_Hours) { if (date('l', $Date->format("Y-m-d")) == 'Saturday' || date('l', $Date->for

我试图使用开始日期计算返回日期,在这种情况下,一组工人每天可以工作多少小时16个工作小时,以及跳过周六和周日分配给项目的总预算小时数

下面是一个计算这些小时数的工作函数,但是,对于使用过多预算小时数的返回日期,它不会运行+

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);
  }
}
echo projectionDatenew日期时间'2017-10-26','1000' 2017-12-27


在这种情况下,使用递归是不合适的。您使用的内存太多,递归调用太多。尝试像这样的不同方法。我强烈建议您查看所有可用的解决方案,尤其是考虑假期的解决方案。格式说明符N为周一提供1,为周日提供7,因此只需检查N<6即可跳过周末。只需保持循环,每次向DateTime对象添加一天,直到达到所需的工作时间。如果你想把国家/银行假日也考虑在内,那么为了简单起见,我建议你从一些网站的复制粘贴中获取相关数据,并将未来几年的日期以简单的yyyy-mm-dd形式放入一个数组中,然后使用in_数组检查相同格式的当前循环日期。date'l',$Date->formatY-m-d-这应该不起作用-Date希望unix时间戳作为第二个参数,而不是yyyy-mm-dd字符串值。new DateInterval'P1D'-该值在任何时候都是相同的,因此无需每次创建新对象。初始化$oneDayDateInterval=新的日期间隔'P1D';在循环之前一次,然后在$Date->add calls中使用它。然后,您仍然在做同样的事情——在日期上添加一天——两次,在if和else分支中。颠倒逻辑-如果不是周末$Date->format'N'<6,则从营业时间中减去16小时。去掉else分支,改为无条件地在date上添加一天,循环结束body}…至于$date->FormatY-m-d,这很奇怪,在我的代码中它确实可以工作,但在php沙箱中却不能在线工作。这听起来像是我不知道你的机器上启用了什么的奇怪副作用,你启用了完整的php错误报告吗?,而不是一些真正有效的东西。再一次,我请求N,一周中的一天数。。。能得到任何比周末更容易的东西。
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;
 }