2017-10-01 3 views
1

정전은 몇 분에서 여러 일까지 걸릴 수 있습니다. 나는 이것을 시작 날짜/시간과 종료 날짜/시간을 가진 정전 테이블에 저장한다. 정전 기록을 저장하면 Carbon을 사용하여 지속 시간 (초)이 계산됩니다.PHP Carbon을 사용하면 두 기간이 겹치는 시간을 초 단위로 삭제합니다.

$outage->duration = $outage->start_time->diffInSeconds($outage->end_time, true); 

은 지금 오후 5시와 오전 7시 59분 59초 (업무 시간 즉, 외부) 사이에 언제든지 제거해야하지만 시작하고 어떤 도움 :)

+0

, 난 당신이 테이블에서 레코드를 삭제할 것인지 생각하면'mysql' 태그를 가지고 있기 때문에

(나는 전형적인 공급자에 use Carbon 수 없기 때문에 나는 당신에게 데모를 표시 할 수 없습니다) ? Eloquent 또는 다른 것을 ORM으로 사용하고 있습니까? – svgrafov

+0

나는 Eloquent를 사용하고있다. 근무 시간뿐만 아니라 기간 열의 기간 인 다른 열을 채우려합니다. 거기에 사용할 수있는 함수가있는 경우 mysql 태그를 사용했습니다 (비록 나의 첫번째 선택이 아닐 것입니다). – kerrin

답변

1

감사 할 위치를 몰라 당신이 할 수있는 일은 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); 

주말이 영업일 기준이 아니거나 영업일 기준이 아닌 경우 언급하지 마십시오. 그런 경우 반복의 현재 요일이 토요일인지 일요일인지 확인하고 그 초를 모두 뺍니다.

여기서 많은 최적화 작업을 수행 할 수 있지만 (예 : 하루 캐싱) 올바른 방향으로 이동해야합니다. 바로 내가 오전,

+0

정말 고마워요. 나는 이것에 지금 갈 것이다 :) – kerrin

+0

@kerrin 나에게 그것이 어떻게 가는지에 관해 안 단다! – ishegg

+0

완벽한, 고마워. 나는 주말 수표를 추가했는데, 지금까지는 모두 좋아 보인다. 더 많은 테스트를 해보 겠지만 승자라고 생각합니다! 고맙습니다 – kerrin

관련 문제