我们如何在PHP中添加两个date间隔
我想添加两个date间隔来计算总的持续时间,以小时和分钟为单位,实际上我想执行addittion,如下所示:
$a = new DateTime('14:25'); $b = new DateTime('17:30'); $interval1 = $a->diff($b); echo "interval 1 : " . $interval1->format("%H:%I"); echo "<br />"; $c = new DateTime('08:00'); $d = new DateTime('13:00'); $interval2 = $c->diff($d); echo "interval 2 : " . $interval2->format("%H:%I"); echo "<br />"; echo "Total interval : " . $interval1 + $interval2;
任何想法如何执行这种types的时间间隔除了得到在PHP中总小时和分钟格式的两个时间间隔的总和
PHP没有运算符重载* so +
与对象使PHP试图将其转换为string,但DateInterval
不支持:
interval 1: 03:05 interval 2: 05:00 Total interval : 08:05
相反,您需要创build一个新的DateTime
对象,然后使用add
函数来添加时间间隔,最后将差异显示到参考点:
$e = new DateTime('00:00'); $f = clone $e; $e->add($interval1); $e->add($interval2); echo "Total interval : ", $f->diff($e)->format("%H:%I"), "\n";
Full Exmaple /( 演示 ):
$a = new DateTime('14:25'); $b = new DateTime('17:30'); $interval1 = $a->diff($b); echo "interval 1: ", $interval1->format("%H:%I"), "\n"; $c = new DateTime('08:00'); $d = new DateTime('13:00'); $interval2 = $c->diff($d); echo "interval 2: ", $interval2->format("%H:%I"), "\n"; $e = new DateTime('00:00'); $f = clone $e; $e->add($interval1); $e->add($interval2); echo "Total interval : ", $f->diff($e)->format("%H:%I"), "\n";
你也可以考虑看看DateInterval
如何存储它的值,然后从它扩展到做你自己的计算。 下面的例子( 演示 )是粗略的,它没有考虑倒转的东西 ,它没有(重新)设置$days
为false
,我没有检查/testing创build期间说明符的ISO规范,但我认为它足以表明这个想法:
class MyDateInterval extends DateInterval { /** * @return MyDateInterval */ public static function fromDateInterval(DateInterval $from) { return new MyDateInterval($from->format('P%yY%dDT%hH%iM%sS')); } public function add(DateInterval $interval) { foreach (str_split('ymdhis') as $prop) { $this->$prop += $interval->$prop; } } } $a = new DateTime('14:25'); $b = new DateTime('17:30'); $interval1 = $a->diff($b); echo "interval 1: ", $interval1->format("%H:%I"), "\n"; $c = new DateTime('08:00'); $d = new DateTime('13:00'); $interval2 = $c->diff($d); echo "interval 2: ", $interval2->format("%H:%I"), "\n"; $e = MyDateInterval::fromDateInterval($interval1); $e->add($interval2); echo "Total interval: ", $e->format("%H:%I"), "\n";
*如果你写了一个PHP扩展,它实际上是可能的(至lesssorting)。
这个function允许你组合任意数量的DateIntervals
/** * Combine a number of DateIntervals into 1 * @param DateInterval $... * @return DateInterval */ function addDateIntervals() { $reference = new DateTimeImmutable; $endTime = clone $reference; foreach (func_get_args() as $dateInterval) { $endTime = $endTime->add($dateInterval); } return $reference->diff($endTime); }
function compare_dateInterval($interval1, $operator ,$interval2){ $interval1_str = $interval1->format("%Y%M%D%H%I%S"); $interval2_str = $interval2->format("%Y%M%D%H%I%S"); switch($operator){ case "<": return $interval1 < $interval2; case ">": return $interval1 > $interval2; case "==" : return $interval1 == $interval2; default: return NULL; } } function add_dateInterval($interval1, $interval2){ //variables $new_value= []; $carry_val = array( 's'=>['value'=>60,'carry_to'=>'i'], 'i'=>['value'=>60,'carry_to'=>'h'], 'h'=>['value'=>24,'carry_to'=>'d'], 'm'=>['value'=>12,'carry_to'=>'y'] ); //operator selection $operator = ($interval1->invert == $interval2->invert) ? '+' : '-'; //Set Invert if($operator == '-'){ $new_value['invert'] = compare_dateInterval($interval1,">",$interval2)?$interval1->invert:$interval2->invert; }else{ $new_value['invert'] = $interval1->invert; } //Evaluate foreach( str_split("ymdhis") as $property){ $expression = 'return '.$interval1->$property.' '.$operator.' '.$interval2->$property.';'; $new_value[$property] = eval($expression); $new_value[$property] = ($new_value[$property] > 0) ? $new_value[$property] : -$new_value[$property]; } //carry up foreach($carry_val as $property => $option){ if($new_value[$property] >= $option['value']){ //Modulus $new_value[$property] = $new_value[$property] % $option['value']; //carry over $new_value[$option['carry_to']]++; } } $nv = $new_value; $result = new DateInterval("P$nv[y]Y$nv[m]M$nv[d]DT$nv[h]H$nv[i]M$nv[s]S"); $result->invert = $new_value['invert']; return $result; } $a = new DateTime('00:0'); $b = new DateTime('17:30'); $interval1 = $a->diff($b); echo "interval 1: ", $interval1->format("%H:%I"), "<br>"; $c = new DateTime('08:01:00'); $d = new DateTime('13:30:33'); $interval2 = $c->diff($d); echo "interval 2: ", $interval2->format("%H:%I"), "<br>"; $addition = add_dateInterval($interval1,$interval2); echo "<pre>"; echo var_dump($addition); echo "</pre>";