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 關注
- 201 瀏覽
添加回答
舉報