我有一个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"
这是对的吗?
答案 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
找到的