【发布时间】:2020-01-22 07:33:47
【问题描述】:
参考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 的回答,所以我会接受他的回答。
【问题讨论】:
-
请添加一些代码以便理解
-
我不确定复制粘贴别人的答案是否代表您的“努力”。在发布新问题之前,您应该尝试一些事情。我们不知道您的实际数据是什么样的。你真的有跨越午夜的打卡时间吗?从午夜附近发生的一组日期时间值中,您确切期望的输出是什么?这个问题需要澄清/关注。如果一个人通常在上午 9 点打卡,但有一天他们在晚上 9 点打卡怎么办?他们是早了 12 小时还是晚了 12 小时?您需要告诉我们您的逻辑要求。
-
我猜你需要给定日期的平均小时/分钟,你能确认一下吗?您链接的那个答案似乎过于复杂,但如果这就是它的作用(应该有更简单的方法来计算平均值)。无论如何,请先展示您的尝试。
-
预计打卡日期需要作为基本参考点——这将决定时间部分应该增加还是减少 24 小时。
-
已更新以满足你们提出的问题。