PHP 中日期列表中的每月平均天数

Average day of month from list of dates in PHP

我正在寻找平均日期并猜测下一个日期。

输入的是日期列表,如下所示:

 $completeDate = array(
     '2015-04-13T00:00:00-0800',
     '2015-03-20T00:00:00-0800',
     '2015-02-17T00:00:00-0800',
     '2015-01-10T00:00:00-0800'
 );

我正在尝试扫描包含 x 个日期的列表,并输出总体日期的平均值。

所以在上面的示例中,我认为输出将是 2015-5-15 is expected average date.

我该如何解决这个问题?

如果您要查找这些日期的平均值,您可以简单地获取每个日期在一年中的第几天,将它们取平均值,然后使用该日期:

$completeDate = array(
    '2015-04-13T00:00:00-0800',
    '2015-03-20T00:00:00-0800',
    '2015-02-17T00:00:00-0800',
    '2015-01-10T00:00:00-0800'
);

$first = null;
$last = null;
foreach($completeDate as $date) {
    $dayOfYear = (new DateTime($date))->format('z');
    if (is_null($first)) {
        $first = $last = $dayOfYear;
    }
    else {
        if ($dt < $first) {
            $first = $dayOfYear;
        }
        if ($dt > $last) {
            $last = $dayOfYear;
        }
    }
}
$avg = round(($first + $last) / 2); 
$averageDate = DateTime::createFromFormat('z', $avg);
echo $averageDate->format('Y-m-d'); // 2015-02-26

Demo

如果您要查找该数组中日期的月中天数的平均值,然后使用下个月的那一天,则只需对月中的天数求平均值,然后将其与下个月:

$completeDate = array(
    '2015-04-13T00:00:00-0800',
    '2015-03-20T00:00:00-0800',
    '2015-02-17T00:00:00-0800',
    '2015-01-10T00:00:00-0800'
);
$month = 0;
$days = 0;
foreach($completeDate as $date) {
    $dt = new DateTime($date);
    $month_num = $dt->format('n');
    if ($month_num > $month) {
        $month = $month_num;
    }
    $days += $dt->format('j');
}
$avg = round($days / count($completeDate));
$date = new DateTime(sprintf('%d-%01d-%01d', $dt->format('Y'), ++$month, $avg));
echo $date->format('Y-m-d');  // 2015-05-15

Demo