Php 返回日期之间的平均时间差,不包括;“非工作时间”;

Php 返回日期之间的平均时间差,不包括;“非工作时间”;,php,Php,我正在为我的公司做一个票务系统。在我的数据库中,我记录了首次提交票据的时间戳和将票据标记为完成的时间戳 我编写了一个函数,返回完成一张票证所需的平均时间(小时): public function calculateAvgResolveTime() { $timeQuery = $this->database->query('SELECT ticketCreated, ticketCompletedOn FROM employeeTickets'); $cumulati

我正在为我的公司做一个票务系统。在我的数据库中,我记录了首次提交票据的时间戳和将票据标记为完成的时间戳

我编写了一个函数,返回完成一张票证所需的平均时间(小时):

public function calculateAvgResolveTime()
{
    $timeQuery = $this->database->query('SELECT ticketCreated, ticketCompletedOn FROM employeeTickets');
    $cumulativeTicketTime = $cumulativeTimes = 0;
    while($time = $timeQuery->fetch_assoc()) {
        $timeCreated = strtotime($time['ticketCreated']);
        $timeCompleted = strtotime($time['ticketCompletedOn']);
        if($timeCompleted > $timeCreated) {
            $cumulativeTimes++;
            $cumulativeTicketTime = $cumulativeTicketTime + ($timeCompleted - $timeCreated);
        }
    }
    $time = ($cumulativeTicketTime / 60 / 60);
    $time = sprintf('%02d:%02d', (int) $time, round(fmod($time, 1) * 60));
    return $time;
}
有没有办法排除某些时间?例如,我们的办公室从周一到周五的09:00-17:00营业

目前,如果一张票在周五的16:30被提出,并在周一的09:15完成,那么平均时间将相当高,而实际上这张票只花了45分钟的工作时间

var\u export()
的结果:


您必须每天循环查看
ticketCreated
ticketCompletedOn
之间的日期。 似乎没有数学方法(或者至少没有可读的格式)来解决这个问题,因为您有时间限制,不包括周六和周日,工作时间从
09:00:00
17:00:00

片段:

<?php

$data =array(
            array ( 'ticketCreated' => '2020-02-03 15:59:30','ticketCompletedOn' => '2020-02-04 09:53:35'),
            array ( 'ticketCreated' => '2020-02-04 14:00:00', 'ticketCompletedOn' => '2020-02-04 14:36:00')
        );

$sum_time = 0;

foreach($data as $details){
    $start_time = new DateTime($details['ticketCreated']);
    $end_time = new DateTime($details['ticketCompletedOn']);
    $end_of_day = new DateTime($start_time->format('Y-m-d') . ' 17:00:00'); // since a day ends at 17:00

    do{
        $diff  = $end_time->diff($start_time);
        $diff2 = $end_of_day->diff($start_time); 
        if($end_time->format('Y-m-d') === $start_time->format('Y-m-d')){ // meaning finished on the same day
            $sum_time += ($diff->h * 60) + ($diff->i) + ($diff->s / 60);
        }else if(!in_array($end_of_day->format('N'),[6,7])){ // skipping Saturdays and Sundays
            $sum_time += ($diff2->h * 60) + ($diff2->i) + ($diff2->s / 60); // add the day's offset(480 minutes)
        }       

        $end_of_day->add(new DateInterval('P1D'));
        $start_time = new DateTime($end_of_day->format('Y-m-d') . ' 09:00:00'); // start time for next day which is 09:00

    }while($start_time <= $end_time);
}


$avg = $sum_time / count($data);

echo "$avg minutes",PHP_EOL;

你能显示你的数组的
var\u export()
吗?@vivek\u 23$time?是的,一个数组中的所有$time和你的预期输出。另外,如果有人在周一16:30开始,周三16:30结束,它的值是多少(以分钟为单位)?@vivek\u 23更新了这个问题。
<?php

$data =array(
            array ( 'ticketCreated' => '2020-02-03 15:59:30','ticketCompletedOn' => '2020-02-04 09:53:35'),
            array ( 'ticketCreated' => '2020-02-04 14:00:00', 'ticketCompletedOn' => '2020-02-04 14:36:00')
        );

$sum_time = 0;

foreach($data as $details){
    $start_time = new DateTime($details['ticketCreated']);
    $end_time = new DateTime($details['ticketCompletedOn']);
    $end_of_day = new DateTime($start_time->format('Y-m-d') . ' 17:00:00'); // since a day ends at 17:00

    do{
        $diff  = $end_time->diff($start_time);
        $diff2 = $end_of_day->diff($start_time); 
        if($end_time->format('Y-m-d') === $start_time->format('Y-m-d')){ // meaning finished on the same day
            $sum_time += ($diff->h * 60) + ($diff->i) + ($diff->s / 60);
        }else if(!in_array($end_of_day->format('N'),[6,7])){ // skipping Saturdays and Sundays
            $sum_time += ($diff2->h * 60) + ($diff2->i) + ($diff2->s / 60); // add the day's offset(480 minutes)
        }       

        $end_of_day->add(new DateInterval('P1D'));
        $start_time = new DateTime($end_of_day->format('Y-m-d') . ' 09:00:00'); // start time for next day which is 09:00

    }while($start_time <= $end_time);
}


$avg = $sum_time / count($data);

echo "$avg minutes",PHP_EOL;