Вычисление среднего времени между временными метками unix

У меня есть база данных, которая содержит сообщения с датой создания (временная метка unix) и датой публикации (временная метка unix). Я хочу рассчитать среднее время публикации сообщения после его создания. Я думаю, что я далеко, но это то, что я получил до сих пор:

$times = array();
foreach($posts as $post) {
    $timeBetween = $post->publicationDate - $post->creationDate;
    array_push($times, $timeBetween);
}
$average = array_sum($times) / count($times);
echo date("H:m:s",mktime(0,0,$average,0,0,0));

Мой оптимальный результат будет примерно таким: 1 день, 12 часов, 13 секунд.

Кто угодно?

Ценим любую помощь!


person Stinis87    schedule 11.12.2013    source источник
comment
Вы пробовали это запустить? Каковы результаты?   -  person Justin Wood    schedule 11.12.2013


Ответы (2)


Почему бы вам не использовать цикл foreach следующим образом:

$time = 0;
foreach ( $posts as $post ) {
    $time += $post->publicationDate - $post->creationDate;
}

$average = $time / count( $posts );

Таким образом, вам не нужно использовать массив, и вы получите тот же результат.

Если вы хотите показать это как 2 days, 4 hours, 43 minutes and 2 seconds, вы можете рассчитать его следующим образом:

// 1 day = 24 hours * 60 minutes * 60 seconds = 86400 seconds
$days    = floor( $average / 86400 );
$hours   = floor( ( $average % 86400 ) / 3600 );
$minutes = floor( ( $average % 3600 ) / 60 );
$seconds = $average % 60;

echo $days . ' day' . ( $days > 0 ? 's' : '' ) . ', ';
echo $hours . ' hour' . ( $hours > 0 ? 's' : '' ) . ', ';
echo $minutes . ' minute' . ( $minutes > 0 ? 's' : '' ) . ', ';
echo $seconds . ' second' . ( $seconds > 0 ? 's' : '' );
person Sander    schedule 11.12.2013
comment
спасибо! :) сработало отлично! и хороший совет об удалении массива. - person Stinis87; 12.12.2013

date() не подходит для этой работы. date() не понимает такой период времени, как 2D 3H 27M, он понимает только моменты времени.

В вашем коде $average будет содержать количество секунд, поэтому вы должны закончить что-то вроде: -

$h = floor($average/3600);
$average -= $h*3600;
$m = floor($average/60);
$average -= $m*60;
$s = floor($average);
echo "$h:$m:$s";
person vascowhite    schedule 11.12.2013