2 回答

TA贡献1876条经验 获得超6个赞
由于您使用的是静态/定义的午休时间,因此可以使用以下逻辑:
如果$startDate是工作日,并且在12:00之前,则为午餐计算的开始日期;否则就是下一个工作日。
如果$endDate是工作日,13:00之后,则为午餐计算的结束日期;否则,是前一个工作日
实际午休时间数等于这些重新计算的日期之间的差额,每个日期一小时。以下是伪代码:
if(!in_array($startDate->format('l'), array('Sunday','Saturday')) && ($startDate->format('g') < 12) {
$startForLunch = $startDate;
}
else {
$startForLunch = new DateTime($start, '+1 day');
while(in_array($startDate->format('l'), array('Sunday','Saturday'))){
$startForLunch->add('1 day');
}
}
if(!in_array($endDate->format('l'), array('Sunday','Saturday')) && ($endDate->format('g') > 13) {
$endForLunch = $end;
}
else {
$endForLunch = new DateTime($endDate, '-1 day');
while(in_array($endDate->format('l'), array('Sunday','Saturday'))){
$endForLunch->add('-1 day');
}
}
$lunchPeriods = $endForLunch - $startForLunch + 1;

TA贡献1898条经验 获得超8个赞
尝试每天在循环中添加一些条件以跳过几个小时怎么样?
($date->format('H') <= 12 || $date->format('H') > 13)
如果小时高于12到13,它将跳过(如果您使用24格式小时)
if($date > $startofday && $date <= $endofday && !in_array($date->format('l'), array('Sunday','Saturday')) && ($date->format('H') <= 12 || $date->format('H') > 13)){
$count++;
}
更新
好吧,如果你的“圣日”是cutom,也许最好在你的功能中添加一些参数来存储你的圣日列表
function business_hours($start, $end,$holyDays = null){
//another line
}
并检查每个日期循环是否在圣日列表中
in_array($date->format('Y-m-d'), $holyDays)
您将获得休息时间和自定义圣日的过滤器
function business_hours($start, $end,$holyDays = null){
$startDate = new DateTime($start);
$endDate = new DateTime($end);
$periodInterval = new DateInterval( "PT1H" );
$period = new DatePeriod( $startDate, $periodInterval, $endDate );
$count = 0;
foreach($period as $date){
$startofday = clone $date;
$startofday->setTime(8,00);
$endofday = clone $date;
$endofday->setTime(17,00);
//just some var to use in conditional check
$notHolyday = true;
//now check the array of holyday and check if in range dates is same with holydays we have
if($holyDays != null && is_array($holyDays) && in_array($date->format('Y-m-d'), $holyDays)){
$notHolyday = false;
}
if($date > $startofday && $date <= $endofday && !in_array($date->format('l'), array('Sunday','Saturday')) && ($date->format('H') <= 12 || $date->format('H') > 13) && $notHolyday){
$count++;
}
}
echo $count;
}
$start = '2020-02-14 08:00:00';
$end = '2020-02-19 08:00:00';
$holyDays = array('2020-02-17','2020-02-18');
$count = business_hours($start,$end,$holyDays);
echo $count;
我希望这是你想要的
- 2 回答
- 0 关注
- 215 浏览
添加回答
举报