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 ) は大まかなもので、反転したものは考慮されておらず、(再) 設定さ$days
れておらず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 拡張機能を作成する場合、実際には可能です (少なくともある程度)。