PHP

Работа с датой PHP

Привет, на скриншоте представлена строка range которая хранит в себе значение диапазона дат (даты разделяются '-')
Есть массив диапазонов дат (intervals на скрине), он хранит в себе уже заранее известные диапазоны дат, в таком же формате как мы получаем их из вне в переменную range

Задача состоит в том, что нужно узнать сколько дней из каждого из диапазона в массиве пользователь затронул указав в форме свой диапазон.

Допустим пользователь выбрал дату 29.05-10.07
Нужно узнать сколько дней из каждого из диапазона в массиве он как бы 'захватил'

Заранее спасибо.
Mediumjess Jess
Mediumjess Jess
424
Получилось так, может есть более простой вариант, не знаю. Проверьте, правильно ли работает
<?
$range = '27.05-24.08';
$intervals = [
'25.05-09.06',
'10.06-30.06',
'15.09-30.09'
];

$range_array = explode ('-', $range); // разбиваем строку на 2 части (дата начала и конца)
$target_start = DateTime::createFromFormat('d.m', $range_array[0]); // создаем объект дата-время по нужному формату
$target_end = DateTime::createFromFormat('d.m', $range_array[1]);

foreach ($intervals as $interval) { // работаем с каждым интервалом
$interval_array = explode ('-', $interval); // разбиваем строку интервала на части
$interval_start = DateTime::createFromFormat('d.m', $interval_array[0]);
$interval_end = DateTime::createFromFormat('d.m', $interval_array[1]);
$interval_end->modify('+1 day'); // затычка т. к daterange не включает последний день

$interval = new DateInterval('P1D'); // устанавливаем интервал 1 день
$daterange = new DatePeriod ($interval_start, $interval, $interval_end); // разбивает дату на интервалы

$count_includes_days = 0; // счетчик дней, которые входят в $range
foreach ($daterange as $date) { // проходимся по каждому дню интервала
if ($date >= $target_start && $date <= $target_end) $count_includes_days ++; // увеличиваем, если дата интервала входит в $range
}

$result_array[] = $count_includes_days; // добавляем количество дней в новый массив
}

print_r ($result_array); // выводим массив
?>
Результат:
Array
(
[0] => 14
[1] => 21
[2] => 0
)
Александр Кольцов
Александр Кольцов
61 226
Лучший ответ
Mediumjess Jess огромное спасибо, сейчас проверю, отпишу
Mediumjess Jess Работает, только есть одно но
При выборе например с 10 июня по 13 - результат будет 4

Но все равно огромное спасибо, сейчас буду думать как это исправить (или вы ответьте если не тяжело)
Посмотри этот пакет: https://carbon.nesbot.com/docs/
Там есть решение твоей задачи, по изучай документацию.
Aydin Eminov
Aydin Eminov
20 312
Сначала парсишь саму дату из строки
$start = strtotime('25.05.2019');
$end = strtotime('09.06.2019');

Потом делаешь так:
$diff = (strtotime ($start)-strtotime ($end))/(60*60*24);

echo $diff; // Столько то дней между датами.

P.S 60*60*24 - это мы получаем сутки (60 сек * 60 мин * 24 часа)
P.S.S Нужно использовать год, для strtotime, иначе вернет false. И не забудь сделать проверку в последнем месяце года, чтобы не получилось 25.12.2019 - 01.01.2019
Mediumjess Jess а как проверить то, сколько дней из каждого заданного интервала 'задела' выбранная дата?

Суть в том чтобы проверить один диапазон даты между другими