31

私は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 つの間隔の合計を取得する方法についてのアイデア

4

4 に答える 4

45

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 拡張機能を作成する場合、実際には可能です (少なくともある程度)。

于 2012-07-19T08:32:53.627 に答える
9

この関数を使用すると、任意の数の 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);
}
于 2014-08-05T22:19:31.457 に答える