Рассчитать дату окончания (SLA) от даты ее начала в рабочие часы - PullRequest
1 голос
/ 29 марта 2019

Мне нужно рассчитать дату окончания / SLA для данной даты начала, учитывая время завершения в минутах в рабочие часы / дни.

Например:

  • дата начала = 2019-03-29 15: 00: 00
  • время завершения = 720 (минут)

С учетом 8 рабочих часов в день (с 9:00 до 17:00) и выходных в воскресенье. Дата окончания должна быть 2019-04-01 11: 00: 00.

Итак, всего часов 12,

  • по 2019-03-29 с 15:00:00 до 17:00:00 (2 часа)
  • по 2019-03-30 с 09:00:00 до 17:00:00 (8 часов)
  • по 2019-04-01 с 09:00:00 до 11:00:00 (2 часа)

Любая помощь по этому вопросу будет принята с благодарностью.

Пока я могу получить общее количество рабочих дней, исключая выходные, но точное время окончания - вот, где я борюсь.

Спасибо.

Обновление:

$bookingDateTime = Carbon::parse('2019-03-29 15:00:00');
$i = 0;
$completion_in_days = (720/60)/8; //converted minutes in no of days
$working_days = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'];

while($i < ($completion_in_days)){
   if(array_search(strtolower($bookingDateTime->englishDayOfWeek), $working_days) !== false){
       $i++; 
   }

   $bookingDateTime->addDay();
}

Это даст мне дату окончания.

1 Ответ

1 голос
/ 29 марта 2019

Пожалуйста, найдите фрагмент ниже, я написал построчно комментируя для понимания

$endDate     = $startDate     = '2019-03-29 15:00:00';
$officeStart = '09:00:00';
$officeEnd   = '17:00:00';
$totalHours  = 12;
$i           = 1;
$flag        = false;
while ($totalHours > 0) {
    $day = date('D', strtotime($endDate)); // fetching day of week
    if ($day == 'Sun') { // checking if sunday thenskip by adding 1 day to end date
        $endDate = date('Y-m-d', strtotime($endDate . " +1 Day")) . ' ' . $officeStart; // adding one day if sunday
        continue;
    }
    $diff  = strtotime($officeEnd) - strtotime(date("H:i:s", strtotime($endDate))); // getting difference of time of office end date and result end date
    $hours = $diff / (3600); // difference in minutes
    if ($hours > $totalHours) {
        $hours = $totalHours;
        $flag  = true; // to break loop if last loop comes
    } else {
        $totalHours = $totalHours - $hours; // substracting hours from total hours left
    }
    $endDate = date('Y-m-d H:i:s', strtotime("+$hours Hour", strtotime($endDate))); // adding hours which are substracted
    if (!$flag) {
        $endDate = date('Y-m-d', strtotime($endDate . " +1 Day")) . ' ' . $officeStart; // if not last loop add day to result end date
    } else {
        break;
    }
}

Вывод

2019-04-01 11:00:00

Демо .

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