Распарсить две даты и вычислить диапазон между ними
Задача такова - написать функцию которая парсит полученные даты, и возвращает диапазон между ними. Но нюанс в том что иногда дата это просто год (2015), а иногда год и месяц (November 2018).
Ответы (1 шт):
Автор решения: Denis640Kb
→ Ссылка
Если необходимо вывести просто количество месяцев и лет в диапазоне, то можно остановиться на $result = $interval->m. ' месяцев '.$interval->y. ' лет';
Если же необходимо вывести массив месяцев, то так (при желании можно и по дням разбить, но в данном контексте в этом нет смысла, так как нигде дата не указывается):
P.S Добавил проверку, чтобы даты можно было указывать в любой последовательности.
$dat1 = 'November 2018';
$dat2 = '2016';
function checkdate1($val, $val2){ // Получаем в функции 2 даты
$dats = [$val,$val2]; // Помещаем в массив
foreach ($dats as $item) { // Запускаем цикл
$dat = explode(' ', $item); // Разбиваем дату по пробелу
if (count($dat) == 1) { // Если количество равно 1, то...
$item = 'January ' . $item; // Записываем в начале январь, т.к. указан просто год.
}
$dd = new DateTime($item); // Преобразуем в datetime
$dats1[] = $dd; // Помещаем в массив
}
if ($dats1[1] < $dats1[0]){ // Если вторая дата меньше первой, то меняем их местами
$temp = $dats1[0];
$dats1[0] = $dats1[1];
$dats1[1] = $temp;
}
$interval = $dats1[1]->diff($dats1[0]); // Получаем разницу datetime
$months = $interval->y * 12 + $interval->m; // получаем месяцы
if ($months >= 1) { // Если их больше или равно 1, то...
$period = new DatePeriod($dats1[0], new DateInterval('P1M'), $months); // Получаем период
$format = 'm.Y'; // устанавливам формат вывода дат.
} else {
return 'Указан один и тот же месяц'; // Если месяцев меньше, то выводим сообщение.
}
$result = []; // Массив для сохранения результатов
foreach ($period as $date) { // Запускаем цикл
$result[] = $date->format($format); // Записываем дату в указанном формате.
}
return $result; // Возвращаем результат
}
print_r(checkdate1($dat2, $dat1)); // Запускаем функцию и передаём в неё даты.