在DateTime()对象中求和时间

时间:2013-05-01 15:23:09

标签: php

我有一个DateTime()对象数组,其中我存储了一些持续时间(如“H:i”) 如何将此数组中的所有元素相加以获得总持续时间?

并且还应该考虑到,如果总持续时间比23:59更重要,那么我必须能够获得nubmer几天。

这可能吗?

我试图这样做:

$duration = new DateTime('00:00');

foreach($routes as $route) {
   $arrival_time = new DateTime();
   $arrival_time->setTimestamp($route->arrival_time);

   $departure_time = new DateTime();
   $departure_time->setTimestamp($route->departure_time);

   $leg_duration = $arrival_time->diff($departure_time);
   $duration->add($leg_duration);
}

但在$duration我的时间不对。

P.S。

使用$duration->add($leg_duration);我从"24:00"时间减去了,为什么? 例如,如果$leg_duration = new DateTime('02:10');结果为"21:50"

$duration->sub($leg_duration);"24:00"

添加时间

这是对的吗?

2 个答案:

答案 0 :(得分:1)

关于部分问题:您正在以反向方式使用diff()方法,代码应该是:

$leg_duration = $departure_time->diff($arrival_time);

因为在你的代码中你计算$ departure_time - $ arrival_time(这是负数,因此给你这个“反转”结果)。

关于添加时间间隔,由于DateTime对象也包含日期,您可能必须执行以下操作才能获得有意义的结果:

$start = new DateTime('00:00');
$duration = $start;

// ...  your loop ...

$total = $start->diff($duration);

$total将是一个DateInterval对象,其字段应包含您的总时差(虽然我没有对此进行测试)。

答案 1 :(得分:0)

echo sum_the_time('01:45:22', '17:27:03');

这会给你一个结果:

  

19:12:2

function sum_the_time($time1, $time2) {
  $times = array($time1, $time2);
  $seconds = 0;
  foreach ($times as $time)
  {
    list($hour,$minute,$second) = explode(':', $time);
    $seconds += $hour*3600;
    $seconds += $minute*60;
    $seconds += $second;
  }
  $hours = floor($seconds/3600);
  $seconds -= $hours*3600;
  $minutes  = floor($seconds/60);
  $seconds -= $minutes*60;
  // return "{$hours}:{$minutes}:{$seconds}";
  return sprintf('%02d:%02d:%02d', $hours, $minutes, $seconds); // Thanks to Patrick
}

我是从here

找到的