合計期間を時間と分で計算するために2つの日付間隔を追加したいのですが、実際には次のように追加を実行します。
$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;
PHPで合計時間と分の形式で2つの間隔の合計を取得するためにこのタイプの間隔追加を実行する方法
PHPには演算子のオーバーロードはありません* +
オブジェクトを使用すると、PHP最初に文字列に変換しようとしますが、DateInterval
はそれをサポートしません:
interval 1: 03:05
interval 2: 05:00
Total interval : 08:05
代わりに、新しい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";
完全な例/( デモ ):
$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
が値を格納する方法を確認し、それから拡張して独自の計算を行うことを検討することもできます。次の例( Demo )はおおざっぱで、考慮されません 反転されたもの 、考慮されます not(re)set $days
to false
そして、私は 作成時の期間指定子 の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拡張機能を書いた場合、それは実際には可能です(少なくとも一種のソートです)。
この関数を使用すると、任意の数の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>";