代码之家  ›  专栏  ›  技术社区  ›  socca1157

PHP中日期列表中的平均月日

  •  0
  • socca1157  · 技术社区  · 11 年前

    我在试着找出平均日期,然后猜下一个。

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

     $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 回复  |  直到 11 年前
        1
  •  1
  •   John Conde    11 年前

    如果你在寻找这些日期的平均值,你可以简单地得到每个日期的一年中的哪一天,求出它们的平均值并使用该日期:

    $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