seoppc
seoppc

Reputation: 2824

Calculate time duration based on shift times

I am trying to calculate $work_in_daytime and $work_in_nighttime.

$nightStart = '22:00';
$nightEnd = '07:00';

$workers = array(
    '0' => array(
        'name'  => 'Lyons',
        'start' => '15:15',
        'end'   => '23:45'
    ),

    '1' => array(
        'name'  => 'Santos',
        'start' => '10:00',
        'end'   => '22:00'
    ),

    '2' => array(
        'name'  => 'Montgomery',
        'start' => '22:30',
        'end'   => '08:00'
    )
); 

I have tried following code.

foreach ($workers as $worker) {
    $startTime = strtotime($em['start']);
    $endTime = strtotime($em['end']);
    $length = formattedTime($endTime - $startTime);

    $nightTimeStart = strtotime($nightStart);
    $nightTimeEnd = strtotime($nightEnd);
    $dayTimeLength = 0;
    $nightTimeLength = 0;

    if ($startTime > $nightTimeStart) {
        $nightTimeLength += $startTime - $nightTimeStart;
    }
    if ($startTime < $nightTimeStart) {
        $dayTimeLength += $nightTimeStart - $startTime;
    }
    if ($endTime > $nightTimeStart) {
        $nightTimeLength += $endTime - $nightTimeStart;
    }
    if ($endTime < $nightTimeStart) {
        $dayTimeLength += $endTime - $nightTimeStart;
    }

    echo 'Day Time: '.$dayTimeLength.PHP_EOL;
    echo 'Night Time: '.$nightTimeLength.PHP_EOL;
}

I am stuck with correct calculation.

Upvotes: 0

Views: 1007

Answers (2)

Craig B
Craig B

Reputation: 481

Try This:

$nightStart = '22:00';
$nightEnd = '07:00';

$workers = array(
    '0' => array(
        'name'  => 'Lyons',
        'start' => '15:15',
        'end'   => '23:45'
    ),

    '1' => array(
        'name'  => 'Santos',
        'start' => '6:00',
        'end'   => '22:00'
    ),

    '2' => array(
        'name'  => 'Montgomery',
        'start' => '22:30',
        'end'   => '08:00'
    )
); 
function timetodate($time)
{
    return date('H:i', $time);

}
foreach ($workers as $worker) {
    $startTime = strtotime($worker['start']);
    $endTime = strtotime($worker['end']);
    $length = date('H:i',($endTime - $startTime));
    $day = strtotime("24H");

    $nightTimeStart = strtotime($nightStart);
    $nightTimeEnd = strtotime($nightEnd);
    $dayTimeLength = 0;
    $nightTimeLength = 0;

    /* Night Time Calculations */
    if ($endTime <= $startTime) {
        if ($startTime >= $nightTimeStart) {
            $nightTimeLength += $day - $startTime;
            if ($endTime <= $nightTimeEnd) {
                $nightTimeLength += $nightTimeEnd - $endTime;
            }
            else
            {
                $nightTimeLength += $nightTimeEnd;
            }
        }
    }
    elseif ($endTime > $nightTimeStart) {
        $nightTimeLength += $endTime - $nightTimeStart;
    }
    elseif ($startTime < $nightTimeEnd) {
        $nightTimeLength += $nightTimeEnd - $startTime;
    }

    /*  Day Time Calculations  */
   if ($startTime >= $nightTimeEnd) {
       if ($endTime <= $nightTimeStart) {
           if ($startTime < $endTime) {
                $dayTimeLength += $endTime - $startTime;
           }
           else
           {
               $dayTimeLength += $endTime - $nightTimeEnd;
           }
        }
        else
        {
            $dayTimeLength += $nightTimeStart - $startTime;
        }
    }
    else
    {
        if ($endTime <= $nightTimeStart) {
            $dayTimeLength += ($endTime - $nightTimeEnd);
        }
        else
        {
            $dayTimeLength += $nightTimeStart - $nightTimeEnd;
        }
    }

    echo "Name:". $worker['name'].PHP_EOL;
    echo 'Day Time: '.timetodate($dayTimeLength).PHP_EOL;
    echo 'Night Time: '.timetodate($nightTimeLength).PHP_EOL.PHP_EOL;
}

https://www.tehplayground.com/CkZ53jjD1cyFEymB

earlier post: Disregard ---- https://www.tehplayground.com/PohT0L7s35m9VKOe

Like this? Although I haven't adjusted it, but i think i need to change it a bit more to get it correctly for the turn of the new day (it doesnt see it as a continous shift i dont think)

Upvotes: 1

user145490
user145490

Reputation: 27

  • The variable $em is undefined.
  • Unsure of what your constants are for daytime and nighttime, but assuming you calculate daytime from 6am to 6pm and night time from 6pm to 6am:

<?php
$start_nighttime = strtotime('18:00');
$end_nighttime = strtotime('05:59');
$start_daytime = strtotime('06:00');
$end_daytime = strtotime('17:59');

foreach($worker as $data){
       $worker_start = strtotime($data['start']);
       $worker_end = strtotime($data['end']);
       if ($worker_start > $start_daytime && $worker_end < $start_nighttime) {
          //Worked only during the day
          $daytime = round(abs($worker_start - $worker_end) / 60, 2);
       } elseif ($worker_start > $start_daytime && $worker_end > $end_nighttime) {
         //Worked during the day and extended past defined night time
         $daytime = round(abs($worker_start - $end_daytime) / 60, 2);
         $nighttime = round(abs($start_nightime - $worker_end) / 60, 2);
       } elseif ($worker_start > $start_nighttime && $worker_end < $end_nighttime){
         //Worked only during the night
         $nighttime = round(abs($worker_start - $worker_end));
       } elseif ($worker_start > $start_nighttime && $worker_end > $end_nighttime){
         //Worked only during the night up until the moring
         $nighttime = round(abs($worker_start - $end_nighttime));
         $daytime = round(abs($start_daytime - $worker_end));
       }
}
?>

Upvotes: 0

Related Questions