감사 할 위치를 몰라 당신이 할 수있는 일은 1 초 간격으로 DatePeriod
을 만드는 것입니다. (이것이 업무상 중요하다고 생각하기 때문에 두 번째 시간이되어야합니다) 각 초가 업무 시간 내에 있는지 확인하십시오. 그렇다면 합계에서 빼십시오.
이것은 매우 비효율적입니다. 예를 들어 하루 종일 86400 수표를 만들어야합니다. 그것은 느리게 느리게 도착합니다. 어쩌면 비즈니스 요구 사항에서 허용하는 경우 1 분 또는 1 시간 간격을 대신 사용하고 몇 가지 추정을 할 수 있습니다. 어쨌든 다음과 같이 할 수 있습니다.
<?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);
주말이 영업일 기준이 아니거나 영업일 기준이 아닌 경우 언급하지 마십시오. 그런 경우 반복의 현재 요일이 토요일인지 일요일인지 확인하고 그 초를 모두 뺍니다.
여기서 많은 최적화 작업을 수행 할 수 있지만 (예 : 하루 캐싱) 올바른 방향으로 이동해야합니다. 바로 내가 오전,
, 난 당신이 테이블에서 레코드를 삭제할 것인지 생각하면'mysql' 태그를 가지고 있기 때문에
(나는 전형적인 공급자에use Carbon
수 없기 때문에 나는 당신에게 데모를 표시 할 수 없습니다) ? Eloquent 또는 다른 것을 ORM으로 사용하고 있습니까? – svgrafov나는 Eloquent를 사용하고있다. 근무 시간뿐만 아니라 기간 열의 기간 인 다른 열을 채우려합니다. 거기에 사용할 수있는 함수가있는 경우 mysql 태그를 사용했습니다 (비록 나의 첫번째 선택이 아닐 것입니다). – kerrin