编辑代码

<?PHP

function forlough_hm2s($time,&$error=null){
    if(empty($time)) {
        $error = "\$time is empty";
        return false;
    }
    if($time != date('H:i',strtotime($time))) {
        $error = '$time format is error';
        return false;
    }
    $time = array_filter(explode(':',$time));
    $h = array_shift($time);
    $m = array_shift($time);
    return intval($h)*3600+intval($m)*60;
}

function forlough_time2hour($len=0){
    if($len>3600*8){
        return 8;
    }
    return bcdiv($len,3600,1);
}

function forlough_count($startTime,$endTime){
    $on_scope='09:00';
    $off_scope='17:30';
    $on_scope = forlough_hm2s($on_scope) ;
    $off_scope = forlough_hm2s($off_scope) ;
    

    $startTime = strtotime($startTime);
    $endTime = strtotime($endTime);
    if($startTime>$endTime){
        list($endTime,$startTime)=[$startTime,$endTime];
    }
    $start_date = date('Y-m-d',($startTime));
    $start_time = date('H:i',($startTime));

    $end_date = date('Y-m-d',($endTime));
    $end_time = date('H:i',($endTime));
    $day_half = 4*3600;
    $day_full = 8*3600;
    $tmp = null;
    $hour = 0;
    while(1){

        if(empty($tmp)){
            $tmp = $start_date;
        }else{
            $tmp = date('Y-m-d',strtotime($tmp.'+1day'));
        }
        if(strtotime($tmp)>strtotime($end_date)) break;
        if($tmp == $start_date && $tmp == $end_date){
            $s_time = forlough_hm2s($start_time);
            $e_time = forlough_hm2s($end_time);
            $v = $end_time-$s_time;
            var_dump($v);
            $hour += forlough_time2hour($v);
            continue;
        }
        if(strtotime($tmp)>strtotime($begin) && strtotime($tmp)<strtotime($end)){
            $hour+=8;
            continue;
        }
        if(  strtotime($tmp)>strtotime($begin) && strtotime($tmp)==strtotime($end) ){
            $s_time = $on_scope;
            $e_time = forlough_hm2s($end_time);
            $hour += forlough_time2hour($end_time-$s_time);
            continue;
        }
    }
}

$list = [
    ['start'=>'2024-10-16 09:00','end'=>'2024-10-16 17:30','val'=>'0'],
    ['start'=>'2024-10-16 08:00','end'=>'2024-10-16 18:30','val'=>'0'],
    ['start'=>'2024-10-19 09:00','end'=>'2024-10-16 14:30','val'=>'0'],
];

foreach($list as $v){
    echo "{$v['start']}~{$v['end']}=>".forlough_count($v['start'],$v['end']),PHP_EOL;
}