2

DateIntervalイベントの平均合計期間 (形式)を計算する方法を探しています。オブジェクトに期間がありDateIntervalますが、それらを合計して平均を計算する必要があります。これまで見てきたソリューションでは、さまざまな金額を秒単位に変換して合計していましたが、最終的なフォームをフォームで提示する必要がありDateTimeます。

平均期間を値として表示するにはどうすればよいDateTimeですか?

編集:

次のように期間を設定します (ここで$busyTime、 と$freeTimeは DateTime オブジェクトです)。

$timetable[$siteID]->duration = $timetable[$siteID]->freeTime->diff($timetable[$siteID]->busyTime,true); //compare time, force to absolute (true)

次に、次のように期間を合計しようとしています。

$totalDuration += $timetable[$siteID]->duration;

この場合、合計期間と数えているアイテムの数の両方で 129 を取得します。これは、それらがすべて 1 の値であることを意味します。ほんの数秒以上を処理できるようにしたいです。それがここで起こっているかどうかはわかりません。

私はそれがうまくいくとは思っていませんでしたが、次のことも試しました:

$totalDuration += $timetable[$siteID]->duration->format("Y-m-d H:i:s");

最後の 1 つは 0 です。

4

1 に答える 1

3

DateTimeタイムスタンプ = 0;でオブジェクトを簡単に作成できます。次に、->add()すべてDateintervalの をそのオブジェクトに。フェッチ->getTimestamp()して、追加された間隔で割ります。平均秒数が得られます。例:

function calculateIntervalAverage() {
    $offset = new DateTime('@0');
    foreach (func_get_args() as $interval) {
        $offset->add($interval);
    }
    return round($offset->getTimestamp() / func_num_args());
}

demo

DateInterval秒をオブジェクトに変換したい場合は、PTxSパラメーターを使用して作成できます。

$interval = new DateInterval("PT3600S");

demo

ただし、デモで見られるように、これはキャリーオーバー ポイントを計算しません。これが問題になる場合でも、持ち越しポイントを再計算できます。例:

class DateIntervalEnhanced extends DateInterval {

    public function recalculate()
    {
        $from = new DateTime('@0');
        $to = clone $from;
        $to->add($this);
        $diff = $from->diff($to);
        foreach ($diff as $k => $v) $this->$k = $v;
        return $this;
    }

}

demo

于 2013-12-18T13:50:33.697 に答える