【问题标题】:Average Timestamp [closed]平均时间戳[关闭]
【发布时间】: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 小时。
  • 已更新以满足你们提出的问题。

标签: php timestamp average


【解决方案1】:

您可以通过映射数组来大大简化这一点,并返回每个时间的秒数(因此您必须去掉日期,并留下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));

【讨论】:

  • 这似乎不能很好地处理跨越两个不同日期的午夜的时间......例如“2013 年 8 月 1 日 00:00”、“2013 年 7 月 31 日 23:50”。预计平均时间为 23:55。输出的平均时间是 11:55。
  • 您只是在原始问题中谈论打卡时间。我们在这里没有结束工作的时间。您需要一对进出来实现这一目标,而您在回答中没有给出任何答案。不过,这绝对是可能的,您只需要一个以输入/输出为值的二维数组,然后找出两个日期之间的秒差。
  • 但是平均时间是花在应用程序上的时间(我确实需要并且已经涵盖的统计数据之一)。我在我问的这个问题中寻找的是他们通常在线的时间。
  • 修改 $time = date("H:i", strtotime($v));到日期("D H:i", strtotime($v));似乎已经完成了跨越午夜时间跨度工作的技巧。
猜你喜欢
  • 2016-03-09
  • 1970-01-01
  • 1970-01-01
  • 2020-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多