Những gì bạn có thể làm là tạo DatePeriod
khoảng thời gian 1 giây (tôi cho rằng điều này là quan trọng trong kinh doanh, vì vậy nó phải là giây) và kiểm tra xem mỗi giây có nằm trong giờ làm việc trong ngày hay không. Nếu đúng, hãy lấy tổng trừ đi.
Tuy nhiên, điều này là khủng khiếp không hiệu quả. Ví dụ, chỉ trong một ngày, bạn phải thực hiện 86400 lần kiểm tra. Nó trở nên chậm nhanh chóng . Thay vào đó, có thể bạn có thể sử dụng khoảng thời gian 1 phút hoặc thậm chí 1 giờ nếu yêu cầu kinh doanh của bạn cho phép và đưa ra một số ước tính. Dù sao, đây là cách bạn có thể làm điều này:
<?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);
Bạn không đề cập đến việc các ngày cuối tuần có phải là ngày làm việc của bạn hay không. Nếu đúng như vậy, chỉ cần kiểm tra xem ngày hiện tại trong lần lặp lại là Thứ Bảy hay Chủ Nhật và trừ tất cả những giây đó.
Bạn có thể thực hiện nhiều tối ưu hóa ở đây (ví dụ:vào bộ nhớ đệm trong ngày), nhưng nó sẽ giúp bạn đi đúng hướng.
(Tôi không thể cho bạn xem bản demo vì tôi không thể use Carbon
trong các nhà cung cấp điển hình)