平均时间戳
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));
参考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));