2013-08-27 3 views
1

Я хочу рассчитать среднее время входа для пользователя в течение определенной продолжительности, у меня есть значения временной отметки для каждого временного интервала. Чтобы вычислить среднее значение, я хочу добавить все временные метки и делить на количество дней. Но сумма всех временных меток дает неправильный ввод, поэтому я хочу преобразовать временные метки в секунды, чтобы добавить их и вычислить среднее значение. Я использую следующий код.php average timestamp

$timeInTotalSec = 0; 
$timeInTotalSec += intval(date("H",$punchintime)) * 60 * 60; 
$timeInTotalSec += intval(date("i",$punchintime)) * 60; 
$timeInTotalSec += intval(date("s",$punchintime));` 

но

date("H",$punchintime) 

дает мне правильное значение, но

intval(date("H",$punchintime)) 

дает мне

Спасибо заранее.

+2

Что находится в '$ punchintime'? Разве это не в секундах, если это 'TIMESTAMP' или это' DATE' в настоящее время? – naththedeveloper

+0

это 'TIMESTAMP' , но если непосредственно используется timestamp для среднего значения, это дает мне неправильный результат. –

+0

hmm, единица времени, секунда, конвертирует временную метку в секунды, это просто нечувствительность ... Пожалуйста, измените название вопроса! – 0xBAADF00D

ответ

1

Ваш вопрос не очень ясен, но я думаю, что понимаю, что вы хотите рассчитать средний удар во времени от серии ударов в разы.

Даты не подходят для этого, вам нужно выделить количество секунд после полуночи за каждые $punchintime и рассчитать среднее значение этого. Следующий код делает это. Я создал несколько раз, чтобы проиллюстрировать свою точку зрения, я ничего не знаю о вашей системе, поэтому генерация входного массива зависит от вас.

$punchInTimes = array(
    '2013-08-01 09:00', 
    '2013-08-02 09:06', 
    '2013-08-03 08:50', 
    '2013-08-04 09:20', 
    '2013-08-05 09:01', 
    '2013-08-06 08:56', 
); 

function getAverageTime(array $times) 
{ 
    $seconds = $average = 0; 
    $result = null; 
    //get seconds after midnight 
    foreach($times as $dateString){ 
     $date = new \DateTime($dateString); 
     list($datePart) = explode(' ', $dateString); 
     $midnight = new \DateTime($datePart); 
     $seconds += $date->getTimestamp() - $midnight->getTimestamp(); 
    } 

    if($seconds > 0){ 
     $average = $seconds/count($times); 
     $hours = floor($average/3600); 
     $average -= ($hours * 3600); 
     $minutes = floor($average/60); 
     $average -= ($minutes * 60); 
     $result = new \DateInterval("PT{$hours}H{$minutes}M{$average}S"); 
    } else $result = new \DateInterval('PT0S'); 
    return $result->format("%Hh %Mm %Ss"); 
} 

echo "Average clock in time is " . getAverageTime($punchInTimes); 

Выход: -

Средние часы во времени 09h 00m 10s

Это не работает в течение времени, которые охватывают полночь, таких как массив, как это: -

$aroundMidnight = array(
    '2013-08-01 23:59', 
    '2013-08-02 00:02', 
); 
+0

'Если я получу время позже, я посмотрю, как справиться с этим делом.« Четыре года спустя, и вы не нашли время, когда: -D – Abela

+0

@Abela Видимо не :) – vascowhite

1

Что вы говорите, это однократное использование. Unixtime - секунды от эпохи unix (1 января 1970 года). Чтобы разделить время на две метки времени, вы можете просто минус первую метку времени со второй.

$timestamp1 = date('U'); 

А потом через какое-то время:

$timestamp2 = date('U'); 

Хранить эти переменные, и когда приходит время, чтобы получить разницу:

$difference = $timestamp2 - $timestamp1; 

Вы можете форматировать время, используя основные математики:

$seconds = $difference; 
$minutes = $seconds/60; 
$hours = $minutes/60; 
$days = $hours/24; 

Надеюсь, это поможет!

0

попробуйте этот код

public static function sec2hms($sec, $padHours = false) { 

    // start with a blank string 
    $hms = ""; 

    // do the hours first: there are 3600 seconds in an hour, so if we divide 
    // the total number of seconds by 3600 and throw away the remainder, we're 
    // left with the number of hours in those seconds 
    $hours = intval(intval($sec)/3600); 

    // add hours to $hms (with a leading 0 if asked for) 
    $hms .= ($padHours) ? str_pad($hours, 2, "0", STR_PAD_LEFT) . ":" : $hours . ":"; 

    // dividing the total seconds by 60 will give us the number of minutes 
    // in total, but we're interested in *minutes past the hour* and to get 
    // this, we have to divide by 60 again and then use the remainder 
    $minutes = intval(($sec/60) % 60); 

    // add minutes to $hms (with a leading 0 if needed) 
    $hms .= str_pad($minutes, 2, "0", STR_PAD_LEFT) . ":"; 

    // seconds past the minute are found by dividing the total number of seconds 
    // by 60 and using the remainder 
    $seconds = intval($sec % 60); 

    // add seconds to $hms (with a leading 0 if needed) 
    $hms .= str_pad($seconds, 2, "0", STR_PAD_LEFT); 

    // done! 
    return $hms; 
}