【问题标题】:How to sum time periods between dates,and get the average如何求和日期之间的时间段,并获得平均值
【发布时间】:2014-02-02 17:40:12
【问题描述】:

我有一个数组,每个元素都有一个 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;    

有什么好的方法可以做到这一点?
谢谢:)

【问题讨论】:

  • 您目前的解决方案有什么问题?
  • 我从中得到一个日期,而不是一个时间段。

标签: php datetime


【解决方案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);

输出:-

平均时间 = 21h 44m 16s

Ref DateTime manual.

【讨论】:

    【解决方案2】:

    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 中求和。

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

    【讨论】:

      【解决方案3】:

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

      但是为了让给定的脚本正常运行,您可能需要对其进行编辑

      $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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多