Задача проверки пересечения диапазона дат довольно часто встречается в разработке. Например, нужно проверить не пересекается ли новое добавляемое событие с уже существующими по времени.
Если не знаешь, как это сделать, то по началу можно сломать себе голову. Но на самом деле всё не совсем не так сложно как кажется.
В этой статье я покажу именно механизм, по которому можно проверить пересекаются ли даты. Извлечение дат из базы данных и прочее мы опустим, потому что задачи могут быть разными. Итак, поехали.
Проверяем пересечение диапазонов дат
Допустим у нас есть 2 диапазона дат со временем. Будем проверять их пересечение. Если даты пересекаются, то будем получать true, иначе false.
Первый диапазон:
- дата начала 2022-05-09 09:42:37
- дата окончания 2022-05-09 12:42:37
Второй диапазон:
- дата начала 2022-05-09 10:42:37
- дата окончания 2022-05-09 13:42:37
Конечно наглядно мы видим, что даты пересекаются, но на практике скорее всего вы будете сравнивать с массивом диапазонов из базы данных и всё не будет так очевидно.
Чтобы сравнивать даты подобного формата нам нужно будет каждую дату пропускать через функцию strtotime(), которая преобразует текстовое представление даты в метку времени Unix.
Формула для сравнения диапазона дат
Теперь самое главное – формула, которой мы будем пользоваться.
data1.start < data2.end и data1.end > data2.start
Если данное выражение дает нам истину, то даты пересекаются, если ложь – то нет.
Давайте посмотрим это на практике.
<?php $date1_start = '2022-05-09 09:42:37'; $date1_end = '2022-05-09 12:42:37'; $date2_start = '2022-05-09 10:42:37'; $date2_end = '2022-05-09 13:42:37'; if(strtotime($date1_start) < strtotime($date2_end) and strtotime($date1_end) > strtotime($date2_start)){ echo 'Пересекаются'; }else{ echo 'Не пересекаются'; }
Можете создать php-файл и скопировать этот код. Результат будет – “Пересекаются”.
Если мы изменим вторую дату, например вот так:
<?php $date1_start = '2022-05-09 09:42:37'; $date1_end = '2022-05-09 12:42:37'; $date2_start = '2022-05-09 12:50:00'; $date2_end = '2022-05-09 13:42:37'; if(strtotime($date1_start) < strtotime($date2_end) and strtotime($date1_end) > strtotime($date2_start)){ echo 'Пересекаются'; }else{ echo 'Не пересекаются'; }
То результат будет – “Не пересекаются”.
В этом примере мы просто выводим текст, но на практике внутри условия вы можете делать, то, что требует ваша задача.
Надеюсь этот урок был вам полезен. До новых встреч.