如何将日期之间的时间段相加,得到平均值

时间:2014-02-02 08:07:24

标签: php datetime

我有一个数组,每个元素都有一个start_date和end_date 我想总结两个日期之间的所有时间段并将它们除以3得到平均时间段。

数组

Array
 (
 [0] => Array
  (
  [start_date] => "2014-01-30 09:27:02"
  [end_date] => "2014-01-30 16:29:38"
  )
 [1] => Array
  (
  [start_date] => "2014-01-28 09:27:02"
  [end_date] => "2014-01-30 16:29:38"
  )
 [2] => Array
  (
  [start_date] => "2014-01-30 09:05:02"
  [end_date] => "2014-01-30 12:12:38"
  )
 )    

我需要这样的事情:

$total=0; 
foreach($array as $ar)    
{   
    $created_dt=strtotime($ar[$start_date]); 
    $done_dt=strtotime($ar[$end_date]); 
    $runing_time= $created_dt - $done_dt - 2*3600;
    $runing_time= date('H:i',$runing_time);     
    $total+=$runing_time;    
}     
$runing_time=$total/3;    

这样做的好方法是什么?
谢谢:))

3 个答案:

答案 0 :(得分:1)

从技术上讲,你已经是正确的了。

但是为了让给定的脚本能够正常运行,你可以将其编辑为

$total=0; 
foreach($array as $ar)    
{   
    $created_dt=strtotime($ar['start_date']); 
    $done_dt=strtotime($ar['end_date']); 
    $runing_time= $created_dt - $done_dt - 2*3600;
    $runing_time= date('H.i',$runing_time);     
    $total+=$runing_time;    
}
$runing_time=$total/3;   

所以我只改变了3件事。 首先你的$ start_date和$ end_date是一个不存在的变量。

和第二个,如果你想要平均值而不是:put。所以它可以被读作双。

如果你想让变量$ total成为真正的值,我会这样做。

 $runing_time= date('H',$runing_time).'.'.date('i',$runing_time)/60*100;

答案 1 :(得分:1)

As shown at this answer这非常简单。 :)(我稍微修改过它)

 $now = time(); // or your date as well
 $your_date = strtotime("2010-01-01");
 $datediff = $now - $your_date;
 $numberOfDays = floor($datediff/(60*60*24));

现在你只需将它放在foreach中并在$ numberOfDays中加入另一个变量。

请记得检查第一个日期是否低于第二个日期

答案 2 :(得分:1)

您在尝试将时间段视为日期/时间时犯了一个根本性错误,您不能在时间段内使用date()及其相关函数。

找到时间段平均值的方法是将秒数相加,然后除以周期数。以下功能执行此操作: -

function averageTime(array $times){
    $total = 0;
    foreach($times as $time){
        $total += (new \DateTime($time['end_date']))->getTimestamp() - (new \DateTime($time['start_date']))->getTimestamp();
    }
    $avSeconds = $total/count($times);
    $hours = floor($avSeconds/3600);
    $avSeconds -= $hours * 3600;
    $minutes = floor($avSeconds/60);
    $avSeconds -= $minutes * 60;
    $seconds = floor($avSeconds);
    return "{$hours}h {$minutes}m {$seconds}s";
}

将示例数组插入其中: -

$times= array(
    0 => Array(
        'start_date' => "2014-01-30 09:27:02",
        'end_date' => "2014-01-30 16:29:38",
    ),
    1 => Array(
        'start_date' => "2014-01-28 09:27:02",
        'end_date' => "2014-01-30 16:29:38",
    ),
    2 => Array(
        'start_date' => "2014-01-30 09:05:02",
        'end_date' => "2014-01-30 12:12:38",
    ),
);

echo "Average time = " . averageTime($times);

输出: -

  

平均时间= 21小时44分16秒

Ref DateTime manual