我正在寻找一种方法来计算事件的平均总持续时间(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。
答案 0 :(得分:2)
您可以使用timestamp = 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());
}
并按添加的数字间隔进行划分。您将获得平均秒数;例如:
DateInterval
的 demo 强>
如果您希望将秒数转换为PTxS
对象,则可以使用$interval = new DateInterval("PT3600S");
参数创建它:
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 强>
但这不会计算结转点,就像你在demo上看到的那样。如果这是一个问题,您仍然可以recalculate carry-over-points;例如:
{{1}}
的 demo 强>