Средний день месяца из списка дат в PHP

0

Я пытаюсь найти среднюю дату и угадать следующую.

Ввод - это список дат, который выглядит так:

 $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'
 );

Я пытаюсь отсканировать список х количество дат и вывести среднее число дат в целом.

Таким образом, в приведенном выше примере я думаю, что выход будет 2015-5-15 ожидаемой средней датой.

Как бы я справился с этим?

  • 1
    Возможно, вы имеете в виду среднюю дату?
Теги:
date
average

1 ответ

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

демонстрация

Если вы ищете среднее значение дня месяца для дат в этом массиве и затем используете этот день следующего месяца, вам просто нужно усреднить дни месяца, а затем использовать его со следующим месяцем:

$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

демонстрация

  • 0
    Извините за путаницу, я верю, что это то, что я ищу, хотя. Взять средний день месяца и затем применить его к следующему месяцу. Спасибо за быстрый ответ с 2 разными ответами тоже.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню