william david
william david

Reputation: 79

PHP Create Timeslots with break hours

I made this Code to make time slots:

$duration = 60;
$cleanup = 0;
$start = "10:00";
$end = '24:00';

function timeslots($duration, $cleanup, $start, $end)
{
  $start = new DateTime($start);
  $end = new DateTime($end);
  $interval = new DateInterval('PT' . $duration . 'M');
  $cleanupinterval = new DateInterval('PT' . $cleanup . 'M');
  $slots = array();

  for ($intStart = $start; $intStart < $end; $intStart->add($interval)->add($cleanupinterval)) {
    $endperiod = clone $intStart;
    $endperiod->add($interval);
    if ($endperiod > $end) {
      break;
    }
    $slots[] = $intStart->format('H:iA') . '-' . $endperiod->format('H:iA');
  }

  return $slots;
}
?>

above code get results like this:

  1. 10:00 AM - 11:00 AM.
  2. 11:00 AM - 12:00 PM.

what I'm trying to do is something like this:

  1. 12:00 AM - 01:00 AM
  2. 01:00 AM - 02:00 AM

3. 10:00 AM - 11:00 AM

  1. 11:00 AM - 12:00 PM.

So I'm trying to make break time from 02:00 AM to 10:00 AM

so the day will start like:

12:00 AM To 02:00 AM and take breake hours from 02:00 AM To 10:00 AM.

Thanks in advance.

Upvotes: 1

Views: 915

Answers (4)

vikramsinh7606
vikramsinh7606

Reputation: 41

I am getting solution for multiple break too. pleas check my answer and tell me if anything wrong with this. no doubt I am using code of @Sachin Sarola I just changes few line as I required for multiple break slot.

function show_time_slots($start_time, $end_time, $duration, $break_arr, $cleanup = 0){

$time_slots = array();
$start_time = strtotime($start_time);
$end_time = strtotime($end_time);

$add_mins  = ($duration + $cleanup) * 60;

while ($start_time <= $end_time)
{
  $startSlotTime = date("h:i A", $start_time); // for 24 format date("H:i", $start_time);
  $slotEndTime = $start_time + $add_mins;
  $endSlotTime = date("h:i A", $slotEndTime); // for 24 format date("H:i", $slotEndTime);

  if($slotEndTime <= $end_time){

    $is_break = false;
    $last_break_end_time = null;
    foreach($break_arr as $key => $break){
      $break_start = strtotime($break['break_start']);
      $break_end = strtotime($break['break_end']);
        if(
          ($start_time > $break_start  &&  $start_time < $break_end ) || ($slotEndTime > $break_start && $slotEndTime < $break_end )
          || ($break_start > $start_time  &&  $break_start < $slotEndTime) || ($break_end > $start_time  &&  $break_end < $slotEndTime)
          ){
          $is_break = true;
          $last_break_end_time = $break_end;
          break;
      }
    }


    if($is_break && $last_break_end_time){
      $start_time = $last_break_end_time;
    }else{
      $time_slots[] = $startSlotTime . "-" . $endSlotTime;
      $start_time += $add_mins;
    }
  }else{
    $start_time += $add_mins;
  }
}

// $time_slots = array_diff( $time_slots, $break );

return $time_slots;

}

$duration = 180;
$cleanup = 0;
$start_time = "10:00";
$end_time = '23:00';
$break_start = '16:00'; // break start
$break_end   = '16:30'; // break end

$break_arr = [
  ['break_start' => '16:00', 'break_end'  => '16:30'],
  ['break_start' => '19:30', 'break_end'  => '20:00']
];

$time_slots = show_time_slots($start_time, $end_time, $duration, $break_arr, $cleanup);

echo '<pre>';
print_r($time_slots);
echo '</pre>';

Out Put

Array
(
    [0] => 10:00 AM-01:00 PM
    [1] => 01:00 PM-04:00 PM
    [2] => 04:30 PM-07:30 PM
    [3] => 08:00 PM-11:00 PM
)

Upvotes: 1

Sachin Sarola
Sachin Sarola

Reputation: 1041

I tried to make a function that will help you to make all possible slots. the function will take the start_time and end_time and based on the duration(in minutes) it will make the slots and it will not create a slot during break time also you can add clean-up or refresh time after every slot if you want that argument will take time in minutes.

I also see that the approved answer of @Khaled Mostafa where copied by a lot of bloggers and they just copy and paste his answer in the same requirement as mine but it didn't help me in this kind of my requirement so after spending some hours I have found this solution.

function show_time_slots($start_time, $end_time, $duration, $break_start, $break_end, $cleanup = 0){

    $time_slots = array();
    $start_time = strtotime($start_time);
    $end_time = strtotime($end_time);

    $break_start = strtotime($break_start);
    $break_end = strtotime($break_end);

    $add_mins  = ($duration + $cleanup) * 60;

    while ($start_time <= $end_time)
    {
      $startSlotTime = date("h:i A", $start_time); // for 24 format date("H:i", $start_time);
      $slotEndTime = $start_time + $add_mins;
      $endSlotTime = date("h:i A", $slotEndTime); // for 24 format date("H:i", $slotEndTime);

      // $sachin = strtotime($startSlotTime);
      if($slotEndTime <= $end_time){
        if(
          ($start_time > $break_start  &&  $start_time < $break_end ) || ($slotEndTime > $break_start && $slotEndTime < $break_end )
          || ($break_start > $start_time  &&  $break_start < $slotEndTime) || ($break_end > $start_time  &&  $break_end < $slotEndTime)
          ){
        
          $start_time = $break_end;
        }else{
          $time_slots[] = $startSlotTime . "-" . $endSlotTime;
          $start_time += $add_mins;
        }
      }else{
        $start_time += $add_mins;
      }
    }

    // $time_slots = array_diff( $time_slots, $break );

    return $time_slots;

}

$duration = 180; // minutes
$cleanup = 0; // minutes
$start_time = "10:00";
$end_time = '23:00';
$break_start = '16:00'; // break start
$break_end   = '16:30'; // break end

$time_slots = show_time_slots($start_time, $end_time, $duration, $break_start, $break_end, $cleanup);

echo '<pre>';
print_r($time_slots);
echo '</pre>';

Out Put

Array
(
    [0] => 10:00 AM-01:00 PM
    [1] => 01:00 PM-04:00 PM
    [2] => 04:30 PM-07:30 PM
    [3] => 07:30 PM-10:30 PM
)

Upvotes: 1

Khaled Mostafa
Khaled Mostafa

Reputation: 74

I Hope this will help You:

    $duration = 60;
    $cleanup = 0;
    $start = "00:00";
    $end = '24:00';
    $break_start = '02:00'; // break start
    $break_end   = '10:00'; // break end
    
    function timeslots($duration, $cleanup, $start, $end, $break_start, $break_end)
    {
      $start = new DateTime($start);
      $end = new DateTime($end);
      $break_start  = new DateTime($break_start);
      $break_end    = new DateTime($break_end);
      $interval = new DateInterval('PT' . $duration . 'M');
      $cleanupinterval = new DateInterval('PT' . $cleanup . 'M');
      $slots = array();
    
      for ($intStart = $start; $intStart < $end; $intStart->add($interval)->add($cleanupinterval)) {
        $endperiod = clone $intStart;
        $endperiod->add($interval);
        if (strtotime($break_start->format('H:i A')) < strtotime($endperiod->format('H:i A')) && strtotime($endperiod->format('H:i A')) < strtotime($break_end->format('H:i A'))) {
          $endperiod = $break_start;
          $slots[] = $intStart->format('H:i A') . ' - ' . $endperiod->format('H:i A');
          $intStart = $break_end;
          $endperiod = $break_end;
          $intStart->sub($interval);
        }
        $slots[] = $intStart->format('H:iA') . '-' . $endperiod->format('H:iA');
      }
    
      return $slots;
    }

and 

$time_slots = timeslots($duration, $cleanup, $start, $end, $break_start, $break_end);

echo '<pre>';
print_r($time_slots);
echo '<pre>';

the result will be :

Array
(
    [0] => 00:00 AM - 01:00 AM
    [1] => 01:00 AM - 02:00 AM
    [2] => 02:00 AM - 02:00 AM
    [3] => 10:00 AM - 11:00 AM
    [4] => 11:00 AM - 12:00 PM
    [5] => 12:00 PM - 13:00 PM
    [6] => 13:00 PM - 14:00 PM
    [7] => 14:00 PM - 15:00 PM
    [8] => 15:00 PM - 16:00 PM
    [9] => 16:00 PM - 17:00 PM
    [10] => 17:00 PM - 18:00 PM
    [11] => 18:00 PM - 19:00 PM
    [12] => 19:00 PM - 20:00 PM
    [13] => 20:00 PM - 21:00 PM
    [14] => 21:00 PM - 22:00 PM
    [15] => 22:00 PM - 23:00 PM
    [16] => 23:00 PM - 00:00 AM
)

Upvotes: 1

Monnomcjo
Monnomcjo

Reputation: 725

Something like that?

function show_time_slots($start_time, $end_time, $duration, $break){

  $time_slots = array();
  $start_time = strtotime($start_time);
  $end_time = strtotime($end_time);

  $add_mins  = $duration * 60;

  while ($start_time <= $end_time)
  {
    $time_slots[] = date("H:i", $start_time);
    $start_time += $add_mins;
  }

  $time_slots = array_diff( $time_slots, $break );

  return $time_slots;

}

And

$start_time = '00:00';
$end_time = '23:00';
$duration = '60';
$break = ['03:00', '04:00', '05:00', '06:00', '07:00', '08:00', '09:00'];

$time_slots = show_time_slots($start_time, $end_time, $duration, $break);

echo '<pre>';
print_r($time_slots);
echo '</pre>';

Return

Array
(
    [0] => 00:00
    [1] => 01:00
    [2] => 02:00
    [10] => 10:00
    [11] => 11:00
    [12] => 12:00
    [13] => 13:00
    [14] => 14:00
    [15] => 15:00
    [16] => 16:00
    [17] => 17:00
    [18] => 18:00
    [19] => 19:00
    [20] => 20:00
    [21] => 21:00
    [22] => 22:00
    [23] => 23:00
)

Upvotes: 1

Related Questions