0

我有一个 DateTime() 对象数组,我在其中存储了一些持续时间(例如“H:i”) 我怎样才能对这个数组中的所有元素求和以获得总持续时间?

而且还应该考虑到,如果总持续时间大于 23:59,我必须能够获得数天。

这可能吗?

我试图这样做:

$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我错了时间。

附言

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

$duration->sub($leg_duration);添加时间"24:00"

这是正确的吗?

4

2 回答 2

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 对象,其字段应包含您的总时差(尽管我没有对此进行测试)。

于 2013-05-01T16:56:48.227 回答
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
}

我从这里找到

于 2016-09-09T01:42:53.530 回答