平均时间戳

Average Timestamp

参考here接受的答案,我有一个计算平均打卡时间的方法。我如何计算午夜的情况?这是原始答案的一个例外,我真的很感激一个解决方案。

$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);

编辑:我被要求澄清一些 -

我使用的数据是登录时间而不是签到时间。我试图找到人们在线的平均时间。我想如果我能找到用户的平均注销和登录时间,我就能找到人们在线的平均时间跨度。

我现在拥有的是我链接的答案建议的代码。我一直试图做的是将所有 DateTimes 相加,然后将小时、分钟和秒除以数组的计数。我的方向对吗?

我正在开发的应用程序将可供来自多个国家/地区的用户访问,因此很难将参考时间设置为午夜,因为甚至有人可能在午夜使用该应用程序。

编辑 2:我意识到了一些事情

我意识到平均登录和注销时间并不是实现我想要的结果的真正方法。我想出了另一种解决方案,使用频率来找出用户在线的平均时间。如果有人有兴趣知道我是如何解决它的,我会很乐意分享。 :)

但是,仅就此问题而言,正确答案是根据@Qirel 的回答,所以我会接受他的回答。

你可以通过映射数组来简化这个,return每个time的秒数(所以你必须去掉日期,并留下 H:i 格式),您可以通过将 strtotime() 函数应用于时间来完成。

获得新数组后,您需要做的就是找到打卡时间当天的平均秒数,您可以通过对新数组中的值求和来完成,除以数组中的条目数。

00:00(午夜)的时间是一天的开始,这个解决方案说明了这一点。

$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',
);

echo date('H:i', array_sum(array_map(function($v) {
        $time = date("H:i", strtotime($v));
        return strtotime($time);
    }, $punchInTimes)) / count($punchInTimes));