我有两个DateTime
对象。
$time1 = new DateTime('01:04:00');
$time2 = new DateTime('00:13:22');
这两个的加法将是:01:17:22
。我该怎么办?
答案 0 :(得分:3)
“一天中的时间”与“持续时间”不同。将两个时间值加在一起是没有意义的 - 无论平台或语言如何。想一想 - “晚上11点”+“凌晨4点”是什么?这是一个荒谬的问题。
你应该考虑PHP的DateInterval
类,而不是DateTime
类。
应该注意的是,如果您按照使用strtotime
的重复帖子上的示例进行操作,则只有在每个单独的输入和最终结果都在24小时之后时,它才会起作用。为什么?因为这是标准日允许的最长时间。这是将“时间”与“持续时间”混合的结果。
这应该适合你:
function time_to_interval($time) {
$parts = explode(':',$time);
return new DateInterval('PT'.$parts[0].'H'.$parts[1].'M'.$parts[2].'S');
}
function add_intervals($a,$b) {
$zerodate = new DateTime('0000-01-01 00:00:00');
$dt = clone $zerodate;
$dt->add($a);
$dt->add($b);
return $zerodate->diff($dt);
}
function format_interval_hhmmss($interval){
$totalhours = $interval->h + ($interval->d * 24);
return $totalhours.$interval->format(':%I:%S');
}
$interval1 = time_to_interval('01:04:00');
$interval2 = time_to_interval('00:13:22');
$interval3 = add_intervals($interval1,$interval2);
echo format_interval_hhmmss($interval3);
请注意,$zerodate
的值选择并不是那么重要。这只是某些参考点是必需的,因为PHP不直接在DateInterval
上提供操作。
另请注意,DateInterval::format
函数没有格式化程序来获取包含天数的总小时数,因此如果总数可能达到24小时或更长时间,那么您必须格式化那部分你自己,就像我在format_interval_hhmmss
函数中所展示的那样。
另请注意,我的PHP技能并不是那么好,因此可能有更有效的方法来编写这些函数。
答案 1 :(得分:2)
function addtime($time1,$time2)
{
$x = new DateTime($time1);
$y = new DateTime($time2);
$interval1 = $x->diff(new DateTime('00:00:00')) ;
$interval2 = $y->diff(new DateTime('00:00:00')) ;
$e = new DateTime('00:00');
$f = clone $e;
$e->add($interval1);
$e->add($interval2);
$total = $f->diff($e)->format("%H:%I:%S");
return $total;
}
答案 2 :(得分:1)
唯一内置的DateTime add / substract方法需要使用DateInterval。 e.g
$t1 = new DateTime('01:04:33');
$new = $t1->add(new DateInterval('PT13M22S'));
^^^^^^---13 minutes, 22 seconds
然而,请注意,由于DateTime可以在DATES和时间上运行,因此您不能像这样一起猛击两次并期望得到可靠的结果。考虑如果你在跨越夏令时边界或跨越一天边界等的间隔进行添加会发生什么......