Vad du kan göra är att skapa en DatePeriod
med 1 sekunds intervall (jag antar att detta är affärskritiskt, så det måste vara till det andra) och kontrollera om varje sekund är inom arbetstiden på dygnet. Om det är det, subtrahera det från summan.
Detta är dock fruktansvärt ineffektivt. Till exempel, bara för en hel dag skulle du behöva göra 86400 kontroller. Det går långsamt snabbt . Kanske kan du istället använda 1 minuts eller till och med 1 timmes intervall om dina affärskrav tillåter det, och göra några uppskattningar. Hur som helst, så här kan du göra detta:
<?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);
Du nämner inte om helger är eller inte är arbetsdagar för dig. Om de är det, kontrollera bara om den aktuella dagen i iterationen är en lördag eller söndag och subtrahera alla dessa sekunder.
Du kan göra många optimeringar här (cacha dagen till exempel), men det borde ta dig i rätt riktning.
(Jag kan inte visa dig en demo eftersom jag inte kan use Carbon
hos de typiska leverantörerna)