PHP Подсчет общего количества часов не дает точного ответа - PullRequest
0 голосов
/ 09 февраля 2019

Я пытаюсь подсчитать общее количество людей на основе того, когда они in, break, resume и out.

У меня есть эти данные:

$data[0]['type'] = 'in';
$data[0]['created_at'] = '2019-02-01 08:01:52';

$data[1]['type'] = 'break';
$data[1]['created_at'] = '2019-02-01 12:00:40';

$data[2]['type'] = 'resume';
$data[2]['created_at'] = '2019-02-01 13:00:39';

$data[3]['type'] = 'break';
$data[3]['created_at'] = '2019-02-01 14:29:21';

$data[4]['type'] = 'resume';
$data[4]['created_at'] = '2019-02-01 14:29:50';

$data[5]['type'] = 'break';
$data[5]['created_at'] = '2019-02-01 14:29:53';

$data[6]['type'] = 'resume';
$data[6]['created_at'] = '2019-02-01 14:30:00';

$data[7]['type'] = 'break';
$data[7]['created_at'] = '2019-02-01 14:30:09';

$data[8]['type'] = 'resume';
$data[8]['created_at'] = '2019-02-01 14:30:12';

$data[9]['type'] = 'out';
$data[9]['created_at'] = '2019-02-01 18:01:51';

$hours = 0;
$minutes = 0;
foreach($data as $key => $d){
    $d['created_at'] = str_replace(" ","T",$d['created_at']);
    if($d['type'] == 'in' || $d['type'] == 'resume'){
        $workingTime = new DateTime($d['created_at']);
    }

    if($d['type'] == 'break' || $d['type'] == 'out'){
        $date2 = new DateTime($d['created_at']);
        $diff = $date2->diff($workingTime);
        $tempHours = $diff->h;

        $tempHours = $tempHours + ($diff->days*24);
        $hours += $tempHours;

        $tempMin = $diff->i;
        $minutes  += $tempMin;
    }
}

if($minutes == 60){
    $hours += 1;
    echo $hours. " hours and 00 minutes";
}else if($minutes > 60){
    $hours = $hours + floor($minutes/60);
    $minutes = $minutes % 60;
    echo $hours. " hours and ".$minutes." minutes";
}else{
    echo $hours. " hours and ".$minutes." minutes";
}

Сумма, которую я получаю: 8 hours and 57 minutes, , тогда как правильный ответ должен быть 08 hour and 59 minutes and 21 seconds.

Я думаю, что причина, по которой я не получаю правильныйответ, потому что в моем коде я не включаю секунды в расчет.

Может ли кто-нибудь помочь мне получить правильный ответ, включив секунды в расчет.

Ваша помощь будет в значительной степениоценили!Спасибо.

Кстати, причина, по которой я знаю, что правильный ответ - 08 hour and 59 minutes and 21 seconds из-за этого сайта: https://www.calculator.net/time-calculator.html

Я получаю сумму разности всехэти:

$a = break - in
$b = break - resume
$c = out - resume
Then: $total_time = $a + $b + $c

Дайте мне знать, если это неясно.Спасибо.

1 Ответ

0 голосов
/ 09 февраля 2019

Этот код будет делать то, что вы хотите.Он обрабатывает каждый элемент массива, устанавливая время начала и окончания работы, когда мы видим in;установка начала периода каждый раз, когда мы видим in или resume;и добавление длины периода к рабочему времени дня каждый раз, когда мы видим out или break.Наконец, мы берем разницу между временем начала дня и временем, которое мы создали, добавляя все периоды, что дает нам рабочее время всего дня.

foreach ($data as $event) {
    $this_time = new DateTime($event['created_at']);
    switch ($event['type']) {
        case 'in':
            $work_start_time = clone $this_time;
            $work_end_time = clone $this_time;
        case 'resume':
            $start_time = $this_time;
            break;
        case 'break':
        case 'out':
            $work_end_time->add($start_time->diff($this_time));
            break;
    }
}
$working_hours = $work_start_time->diff($work_end_time);
echo $working_hours->format('%H hours, %i minutes, %s seconds');

Вывод:

08 hours, 59 minutes, 21 seconds

Примечание

Если смена может длиться более суток, вам нужно изменить последнюю строку на следующую:

echo $working_hours->format('%a days, %H hours, %i minutes, %s seconds');

Или, если вам нужноесть только часы, а не дни, используйте это:

echo $working_hours->days*24+$working_hours->h . $working_hours->format(' hours, %i minutes, %s seconds');

Демо на 3v4l.org

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...