Yang dapat Anda lakukan adalah membuat DatePeriod
interval 1 detik (saya menganggap ini bisnis penting, jadi harus ke detik) dan periksa apakah setiap detik berada dalam jam kerja hari itu. Jika ya, kurangi dari totalnya.
Ini sangat tidak efisien, meskipun. Misalnya, hanya untuk sehari penuh Anda harus membuat 86400 cek. Itu menjadi lambat cepat . Mungkin Anda dapat menggunakan interval 1 menit atau bahkan 1 jam jika persyaratan bisnis Anda memungkinkan, dan membuat beberapa perkiraan. Bagaimanapun, ini adalah bagaimana Anda dapat melakukan ini:
<?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);
Anda tidak menyebutkan apakah akhir pekan adalah atau bukan hari kerja untuk Anda. Jika ya, cukup periksa apakah hari saat ini dalam iterasi adalah hari Sabtu atau Minggu dan kurangi semua detik tersebut.
Anda dapat melakukan banyak pengoptimalan di sini (menyimpan hari itu, misalnya), tetapi itu akan membawa Anda ke arah yang benar.
(Saya tidak bisa menunjukkan demo karena saya tidak bisa use Carbon
di penyedia biasa)