DateTime :: add agrega horas incluso cuando el intervalo solo debería ser segundos

Esto viene de mi pregunta anterior sobre cómo obtener el intervalo de tiempo promedio sobre un conjunto de datos específico, [ubicado aquí] [1]. Publicaré toda la función nuevamente:

function getATBData($siteID, $fromDate, $toDate) { global $pdo; $ATBarray = array(); $maxATB; $minATB; $avgATB; $totalATB=new DateTime("@0"); $totalEvents=0; $timetable; $query = "SELECT id, siteID, start_time, end_time FROM atb_log WHERE siteID=:siteID AND (start_time BETWEEN :fromDate AND :toDate) AND (end_time BETWEEN :fromDate AND :toDate)"; $stmt = $pdo->prepare($query); $stmt->bindParam(":siteID", $siteID); $stmt->bindParam(":fromDate", $fromDate); $stmt->bindParam(":toDate", $toDate); $stmt->execute(); foreach ($stmt as $row) { $timeDiff = date_diff(new DateTime($row['start_time']),new DateTime($row['end_time']), true); //force absolute if(!isset($maxATB) OR dateIntervalInSeconds($timeDiff) > dateIntervalInSeconds($maxATB)) $maxATB = $timeDiff; if(!isset($minATB) OR dateIntervalInSeconds($timeDiff) add($timeDiff); echo "added " . $timeDiff->format("%H:%I:%S") . " total is now: " . $totalATB->format("H:i:s") . "
"; $totalEvents++; } if($totalEvents!=0) { $avgATB = average_time($totalATB->format("H:i:s"),$totalEvents,0); } else { $avgATB=0; $maxATB=new DateInterval('PT0S'); $minATB=new DateInterval('PT0S'); } //$avgSeconds = new DateInterval("PT" . $avgATB . "S"); $ATBarray['max'] = $maxATB->format("%H:%I:%S"); $ATBarray['min'] = $minATB->format("%H:%I:%S"); $ATBarray['avg'] = $avgATB; $ATBarray['total'] = $totalATB->format("H:i:s"); $ATBarray['events'] = $totalEvents; return $ATBarray; }

Dada esta función, he agregado una statement de salida para intentar depurar por qué estaba obteniendo un intervalo de tiempo tan grande para mi tiempo total (cuando la mayoría de los valores son una pequeña cantidad de segundos) y esto es lo que está generando:

 added 00:00:02 total is now: 01:00:02 added 00:00:00 total is now: 02:00:02 added 00:00:01 total is now: 03:00:03 added 00:00:01 total is now: 04:00:04 added 00:00:00 total is now: 05:00:04 added 00:00:02 total is now: 06:00:06 added 00:00:00 total is now: 07:00:06 

y así. Entonces, parece que, a pesar del tiempo que se debe agregar solo unos segundos, agrega una hora cada vez. La llamada para add() en $timeDiff arriba es cómo estoy agregando.

Entonces la pregunta es: ¿hay una manera diferente de llamar a la función add() modo que solo agregue los segundos? ¿Lo estoy llamando incorrectamente?

Hm, diferencia promedio en segundos, por qué esa franja PHP de código si tu base de datos puede dártela:

 SELECT SEC_TO_TIME(MAX(TIME_TO_SEC(TIMEDIFF(end_time,start_time)))) AS max_timediff, SEC_TO_TIME(MIN(TIME_TO_SEC(TIMEDIFF(end_time,start_time)))) AS min_timediff, SEC_TO_TIME(AVG(TIME_TO_SEC(TIMEDIFF(end_time,start_time)))) AS avg_timediff, SEC_TO_TIME(SUM(TIME_TO_SEC(TIMEDIFF(end_time,start_time)))) AS sum_timediff, COUNT(id) as total_events FROM atb_log WHERE siteID=:siteID AND start_time > :fromDate AND end_time < :toDate 

Formatee los min / max / avg / sum de segundos que desee.

Como escribí en la respuesta a su otra pregunta, este es un problema de horario de verano (DST). En los EE. UU., El horario de verano ya comenzó; en Europa no.

Prueba este código:

 timecheck("Europe/Amsterdam"); timecheck("America/Los_Angeles"); function timecheck($timezone) { date_default_timezone_set($timezone); $totalATB=new DateTime("@0"); $t1 = "2014-01-01 17:30:00"; $t2 = "2014-01-01 17:35:00"; $dt1 = new DateTime($t1); $dt2 = new DateTime($t2); $timeDiff = date_diff($dt1, $dt2, true); printf("[%s] Starting with with: %s\n", $timezone, $totalATB->format("H:i:s")); $totalATB->add($timeDiff); printf("[%s] added %s, total is now: %s\n", $timezone, $timeDiff->format("%H:%I:%S"), $totalATB->format("H:i:s")); } 

La salida:

 [Europe/Amsterdam] Starting with with: 00:00:00 [Europe/Amsterdam] added 00:05:00, total is now: 00:05:00 [America/Los_Angeles] Starting with with: 00:00:00 [America/Los_Angeles] added 00:05:00, total is now: 01:05:00