【问题标题】:Getting the average of an array of dates differences using PHP使用 PHP 获取日期差异数组的平均值
【发布时间】:2012-02-14 21:15:46
【问题描述】:

我正在尝试使用我自己构建的分析来获取用户在我的网站上花费的平均时间。
我现在正在使用 DateTime 类,但数学似乎很粗略。假设我有一系列登录时间和注销时间。

$array = array(
    array("login" => '2012-01-31 10:35:58', "logout" => '2012-02-01 10:35:58'),
    array("login" => '2012-02-04 10:35:58', "logout" => '2012-02-05 10:35:58')
);

我想获取每次登录和注销之间的时间,然后找到所有这些时间的平均值。

【问题讨论】:

  • 您希望返回的平均时间是什么格式?秒、分、小时、天?

标签: php


【解决方案1】:
$total = 0;
$count = 0;
foreach ($array as $timestamp) {
    $diff = strtotime($timestamp['logout']) - strtotime($timestamp['login']);
    $total += $diff;
    $count++;
}

echo "Average session time is ", $total / $count;

为了安全起见,您最好使用DateTime::createFromFormat() 进行日期->时间解析。您的时间戳是一种不错的正常格式,但是当您有一些不稳定的格式时,strtotime 是不可靠的。

同样,此代码假定所有登录/注销对都已完全定义。如果您有任何时间不在的地方,您最终会得到一些巨大的异常值,因为它们很可能会以0 的形式出现,而不是正常的“现代”时间戳。

【讨论】:

【解决方案2】:

你可以这样做:

$sessions = array();
foreach($array as $s) {
    $sessions[] = strtotime($s['logout']) - strtotime($s['login']);
}

现在$sessions 是以秒为单位的所有会话长度的数组,所以如果你这样做:

$average = array_sum($sessions) / count($sessions);

这是平均会话长度,以秒为单位。然后你可以以人类可读的格式打印它,但我认为that's beyond the scope of this question

我首先将会话长度放在一个数组中而不是简单地将它们总结在循环中的原因是,您还可以从中获取其他统计信息,例如最长/最短会话、中位数等。

【讨论】:

    【解决方案3】:

    使用DateTime 的示例(已测试)。

    define('DATETIME_FORMAT', 'Y-m-d H:i:s');
    
    $array = array(
        array('login' => '2012-01-31 10:35:58', 'logout' => '2012-02-01 10:35:58'),
        array('login' => '2012-02-04 10:35:58', 'logout' => '2012-02-06 10:22:58')
      );
    
    $total = 0;
    $count = 0;
    
    foreach($array as $timeInfo)
    {
      $loginDatetime = DateTime::createFromFormat(DATETIME_FORMAT, $timeInfo['login']);
      $logoutDatetime = DateTime::createFromFormat(DATETIME_FORMAT, $timeInfo['logout']);
    
      $total += ($logoutDatetime->getTimestamp() - $loginDatetime->getTimestamp());
      $count++;
    }
    
    $average = $total / $count;
    echo "Average session duration: ".$average." seconds";
    

    编辑: 最初我使用数组来存储差异,以 array_sum() / count() 结尾来计算平均值,但我发现 Marc B 的解决方案是 @ 987654324@ 和 $count 更简单,当然也更快(这里可能很重要,因为可能会处理很多登录/注销日期时间)。 => 在这里应用它。

    【讨论】:

      【解决方案4】:
      $array = array( array ("login" => "2012-01-31 10:35:58", "logout" => "2012-02-01 10:35:58"),
                     array ("login" => "2012-02-04 10:35:58", "logout" => "2012-02-05 10:35:58") );
      
      $amount = 0 ;
      
      foreach( $array as $at )
      
      {
      
            $amount += strtotime( $at[ "logout" ] ) - strtotime( $at[ "login" ] ) ;
      }
      
      $average = $amount / count( $array ) ;
      
      echo "amount: $amount seconds\naverage  $average seconds\n" ;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-09
        • 1970-01-01
        • 2015-11-13
        • 2020-10-26
        • 1970-01-01
        • 1970-01-01
        • 2023-01-19
        • 1970-01-01
        相关资源
        最近更新 更多