Това, което можете да направите, е да създадете DatePeriod
на интервали от 1 секунда (предполагам, че това е критично за бизнеса, така че трябва да е до секунда) и проверете дали всяка секунда е в рамките на работното време на деня. Ако е, извадете го от общата сума.
Това обаче е ужасно неефективно. Например, само за цял ден ще трябва да направите 86400 чека. Става бавно бързо . Може би вместо това можете да използвате интервал от 1 минута или дори 1 час, ако вашите бизнес изисквания го позволяват, и да направите някои оценки. Както и да е, ето как можете да направите това:
<?php
use Carbon\Carbon;
$startTime = Carbon::create(2017, 9, 10, 8, 20, 0);
$endTime = Carbon::create(2017, 9, 10, 18, 35, 0);
$duration = $startTime->diffInSeconds($endTime, true);
$interval = new DateInterval("PT1S");
$period = new DatePeriod($startTime, $interval, $endTime);
$secondsToSubtract = 0;
foreach ($period as $second) {
$businessStart = clone $second;
$businessStart->setTime(8, 0); // start business day
$businessEnd = clone $second;
$businessEnd->setTime(17, 0); // end business day
if (!($second > $businessStart && $second < $businessEnd)) { // if the second is not a "business second", subtract it
$secondsToSubtract++;
}
}
var_dump($secondsToSubtract);
$realDuration = $duration - $secondsToSubtract;
var_dump($realDuration);
Не споменавате дали уикендите са или не са работни дни за вас. Ако са, просто проверете дали текущият ден в повторението е събота или неделя и извадете всички тези секунди.
Можете да направите много оптимизации тук (кеширане на деня, например), но това трябва да ви отведе в правилната посока.
(Не мога да ви покажа демонстрация, защото не мога да use Carbon
в типичните доставчици)