2014-07-14 1 views
2

내 앱에서 프로젝트를 만들 수 있으며 각 프로젝트별로 작업 보고서를 기록 할 수 있습니다. 각 보고서에는 시작 및 종료 시간 소인이 있습니다. 프로젝트 설명의 표에는이 프로젝트의 모든 보고서가 표시되며 기간 (DateTime 및 시작 및 종료 타임 스탬프 사이에 사용되는 diff() 함수 사용)도 계산됩니다. 이제 프로젝트의 총 작업 시간을 계산하고 싶지만 어떻게 할 수 있는지 잘 모릅니다. 이미 날짜 시간 함수를 사용하여 어떻게 든 다음 모든 보고서를 통해 반복했지만, 나는 ... 내 마지막 필사적 인 시도이 있었다 효과가없고 해요 :PHP에서 다중 간격을 요약하는 방법

public static function calculateDuration($start, $end) 
{ 
    $start = date('Y-m-d H:i:s', $start); 
    $end = date('Y-m-d H:i:s', $end); 

    $s = new \DateTime($start); 
    $e = new \DateTime($end); 
    $interval = $e->diff($s); 

    return $interval->format('%H:%I'); 
} 

public static function calculateTotal($idProject) 
{ 
    $reports = self::find('id_project = "' . $idProject . '"'); 
    $totalReports = new \DateTime(); 
    foreach ($reports as $report) { 
     $totalReports->add(new \DateInterval(self::calculateDuration($report->getStart(), $report->getEnd()))); 
    } 
    /*echo '<pre>'; 
    die(var_dump($totalReports)); 
    echo '</pre>';*/ 
    return $totalReports->format('H:I'); 
} 

calculateDuration 기능이 완벽하게 작동하지만, 물론 calculateTotal하지 않는 왜냐하면 DateInterval은 "0:30"과 같은 문자열을 사용하지 않기 때문입니다. 그래서 그것은 완전히 쓸모가 없습니다 ...

나는 필요한 정보를 모두 제공했으면 좋겠어. 이미 calculateDuration 모든 일을 가지고, 그것은 내부적으로 DateInterval 객체를 다루는 : 내 의견에 명확성을 위해

// Untested. Might need escaping. 
return $interval->format('PT%HH%IM'); 
+0

'DateInterval'을 문자열로 형식화 한 후 다시'DateInterval' 개체로 다시 만들면 안됩니다. 'calculateDuration' 함수에서'DateInterval' 객체를 반환하거나 간격을 반환하고'calculateDuration'에서 내부적으로 사용하는 별도의 함수를 가지고 있습니다. – cmbuckley

+0

@cbuckley 또한이 함수를 사용하여 단일 보고서의 기간을 출력합니다 ... 따라서 calculateDuration의 반환 값을 변경할 수 없거나 많은 오류 메시지가 나타납니다 –

+0

그 두 번째 옵션의 의미는 다음과 같습니다. 별도의 기능, 예. 'calculateInterval'은 interval 객체를 반환합니다. 그렇다면'calcalateDuration'은'return calculateInterval() -> format ('% H : % I');'이됩니다. 그런 다음 루프에서'calculateInterval'을 사용하십시오. calculateDuration 함수의 – cmbuckley

답변

1

을 :

+0

은 매력처럼 작동합니다! 단지 이것을 사용할 때 calculateDuration의 return 명령에'$ start'와'$ end'를 추가하는 것을 잊지 마십시오 :) 대단히 감사합니다! –

+1

감사합니다. 업데이트 됨 :-) 나는 또한'DateTime' 객체가 어떻게 생성되는지에 대한 변경을 추가했습니다. 이것은'date'를 통해가는 것보다 조금 깔끔합니다. – cmbuckley

+0

내 시스템에도 포함되어 있습니다. 좀 더 중복 된 코드 줄이 제거되었습니다. :) –

1

그냥 대신 시간과 분을 반환하는 유효한 DateInterval 형식을 만들 수 있습니다. 그럼 왜 그것을 사용하지 않습니까? 여기에서 getInterval은 기존 메서드 둘 다에서 사용되는 보호 된 메서드이며 DateInterval 개체를 직접 반환합니다. 이제 calculateDuration은 간단한 형식 지정 함수가되고 calculateTotal은 DateInterval 개체에 액세스 할 수 있습니다.

protected static function getInterval($start, $end) 
{ 
    $s = new \DateTime('@' . $start); 
    $e = new \DateTime('@' . $end); 
    return $e->diff($s); 
} 

public static function calculateDuration($start, $end) 
{ 
    return self::getInterval($start, $end)->format('%H:%I'); 
} 

public static function calculateTotal($idProject) 
{ 
    // ... 

    $totalReports = new \DateTime(); 
    $totalReportsEnd = clone $totalReports; 

    foreach ($reports as $report) { 
     $totalReportsEnd->add(self::getInterval(
      $report->getStart(), 
      $report->getEnd() 
     )); 
    } 

    $totalInterval = $totalReportsEnd->diff($totalReports); 
    // do as you wish with the interval 
} 
+0

? 이 함수는 한 보고서의 기간을 표시하는데도 사용됩니다 ... 그래서이 함수를 실제로 다시 작성할 수는 없습니다. 하지만 당신의 충고로 무언가를 시도 할게요! –

관련 문제