Quello che puoi fare è creare un DatePeriod
di intervalli di 1 secondo (presumo che questo sia critico per l'azienda, quindi deve essere al secondo) e controlla se ogni secondo rientra nell'orario lavorativo del giorno. Se lo è, sottrailo dal totale.
Questo è terribilmente inefficiente, però. Ad esempio, solo per un giorno intero dovresti fare 86400 assegni. Diventa lento rapidamente . Forse puoi invece utilizzare un intervallo di 1 minuto o anche 1 ora se le tue esigenze aziendali lo consentono e fare alcune stime. Ad ogni modo, ecco come puoi farlo:
<?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);
Non dici se i fine settimana sono o non sono giorni lavorativi per te. Se lo sono, controlla se il giorno corrente nell'iterazione è un sabato o una domenica e sottrai tutti quei secondi.
Puoi apportare molte ottimizzazioni qui (memorizzare il giorno nella cache, ad esempio), ma dovrebbe portarti nella giusta direzione.
(Non posso mostrarti una demo perché non posso use Carbon
nei provider tipici)