Получить оставшееся время между двумя датами, учитывая рабочие часы - PullRequest
0 голосов
/ 31 января 2020

Я пытаюсь написать php решение для расчета запланированного времени окончания с учетом цели в рабочие часы.

Не должно учитываться несколько дней (извлечено из настройки сохранено в дБ), например, праздничные дни.

Также рабочие часы извлекаются из дБ (morning_from (8:30 am), morning_to (13:00 pm), вечером_from (14:30), вечером_to (18:30)).

Я хочу разработать этот сценарий, потому что я хочу, чтобы на моей странице оставалось время для технического разрешения открытого билета каждый день.

Например:

клиент, имеющий контракт с 10 рабочими часами, SLA открывает билет сегодня (пятница) 31/01/2020 16:00:00, учитывая, что в массиве noBusinessDays = (суббота), «воскресенье») и businessHours , как указано выше (8: 30-13: 00/14: 30-18: 30), результат должен быть понедельник 3/02/2020 17 : 30: 00.

Пример кода:

$noBusinessDays = array("saturday", "sunday");
$businessHours = array("morning_from" => "8:30", "morning_to" => "13:00", "evening_from" => "14:30", "evening_to" => "18:30");

$SLA = "10"; //hours

$ticketDate = new DateTime();
$ticketDate->setTimestamp(strtotime("31/01/2020 16:00:00"));

// I don't know how to use my arrays to say in this calculation how to use them
$maximumLimit = $ticketDate->add(new DateInterval("PT" . $SLA ."H"));

Спасибо в преимущество се.

Ответы [ 2 ]

0 голосов
/ 31 января 2020

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

Начните с вычисления количества «целых недель». Каждая "целая неделя" - это пять рабочих дней. Вычтите соответствующий интервал времени и продолжайте. Теперь посмотрите на день недели начальной даты: каждый день добавляет определенное количество дней. Затем день недели даты окончания, аналогично. Затем можно при необходимости считать время суток.

Праздники - это простая таблица: если день попадает в диапазон, вычтите один день.

Теперь ... сказав все это самое первое, что я бы сделал , - это поиск в GitHub и SourceForge! Потому что я очень уверен, что кто-то там уже сделал это. : - D

 "Actum Ne Agas:  Do Not Do A Thing Already Done."
0 голосов
/ 31 января 2020

Вы можете использовать следующую функцию

// intersection of 2 time intervals
// input - Unix timestamps (start,end)
// output - intersection in seconds
function time_union($b_1,$e_1,$b_2,$e_2)
{
  return max(0,$e_1-$b_1 - max(0,$e_1-$e_2) - max(0,$b_2-$b_1));
}

Вы начнете с пустого временного интервала [X, Y), где X - это отметка времени создания заявки, а Y изначально равно X.

Затем вы начинаете добавлять дни к Y - один за другим. Каждый раз, когда вы расширяете интервал времени, чтобы он содержал еще один день, вы используете вышеуказанную функцию, чтобы проверить, сколько часов SLA покрыто (т. Е. Перекрывается) с рабочим временем дня, который вы только что добавили. Если день отмечен как выходной - вы просто пропустите его и переходите к следующей дате.

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

В конце концов Y будет соответствовать отметке времени, которую вы хотите показать в своем приложении.

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