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 的值。如果是这样的话,这很好(可能每个 1 秒?)但我希望能够处理的不仅仅是几秒钟。我不确定这是否是这里发生的事情。

我也尝试了以下方法,但我没想到它会起作用:

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

对于最后一个,我得到 0。

4

1 回答 1

3

DateTime您可以使用 timestamp =简单地创建对象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 回答