【问题标题】:Average day of month from list of dates in PHPPHP中日期列表中每月的平均天数
【发布时间】:2015-03-06 23:47:40
【问题描述】:

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

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

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

我将如何解决这个问题?

【问题讨论】:

  • 你的意思是中间日期吗?

标签: php date average


【解决方案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

【讨论】:

  • 很抱歉造成混乱,但我相信这就是我正在寻找的。取一个月的平均天数,然后将其应用到下个月。感谢您快速回复 2 个不同的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 2016-01-25
  • 1970-01-01
相关资源
最近更新 更多