Co můžete udělat, je vytvořit DatePeriod
1 sekundových intervalech (předpokládám, že je to pro obchod kritické, takže to musí být na sekundu) a zkontrolujte, zda každá sekunda spadá do pracovní doby dne. Pokud ano, odečtěte jej od součtu.
To je ale strašně neefektivní. Například jen za celý den byste museli provést 86 400 kontrol. Jde to pomalu rychle . Možná můžete místo toho použít interval 1 minuty nebo dokonce 1 hodiny, pokud to vaše obchodní požadavky dovolují, a provést nějaké odhady. Každopádně to můžete udělat takto:
<?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);
Neuvádíte, zda pro vás víkendy jsou nebo nejsou pracovními dny. Pokud ano, zkontrolujte, zda je aktuální den v iteraci sobota nebo neděle, a odečtěte všechny tyto sekundy.
Můžete zde provést spoustu optimalizací (například ukládání dne do mezipaměti), ale mělo by vás to navést správným směrem.
(Nemohu vám ukázat demo, protože nemohu use Carbon
u typických poskytovatelů)