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

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

Входные данные представляют собой список дат, который выглядит следующим образом:

 $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 ожидается средняя дата.

Как бы я занялся этим?

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

$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

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

1

Другие решения

Других решений пока нет …