在给定 PHP 个 DateTime 对象数组的情况下查找平均日期

Finding the average date given an array of PHP DateTime Objects

我有一个 PHP 日期时间对象数组:

$dates = [
    new DateTime('2019-08-15'),
    new DateTime('2019-08-19'),
    new DateTime('2019-08-20')
];

我想从这个数组中得到的是平均日期,在我的计算中是2019-08-18.

有没有一种简单的方法可以做到这一点,而无需分解每个项目的日期部分并找到所有部分的平均值,然后将它们拼接回去?

谢谢!

基本上你别无选择,只能遍历所有值并对它们求和(使用时间戳是最有效的方法),取平均值,然后将该值转换回日期:

echo date('Y-m-d', array_reduce($dates, function ($c, $d) {
    return $c + $d->format('U');
}, 0)  / count($dates));

另一种方法是找出每个日期与数组中第一个日期之间的差异,然后取这些值的平均值并将其添加到第一个日期:

$days = 0;
foreach ($dates as $date) {
    $days += $dates[0]->diff($date)->days;
}
$days = intdiv($days, count($dates));
$avg_date = (clone $dates[0])->modify("+$days days");
echo $avg_date->format('Y-m-d');

两种情况下的输出都是:

2019-08-18

Demo on 3v4l.org