PHP日期列表中的平均日期

时间:2015-03-06 23:47:41

标签: php date average

我正在尝试找到平均日期并猜测下一个日期。

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

 $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预期的平均日期。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

如果您正在寻找这些日期的平均值,您可以简单地获取每个日期中的每一天,将它们平均,并使用该日期:

$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