Вы можете использовать следующую функцию
// 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
будет соответствовать отметке времени, которую вы хотите показать в своем приложении.