PHP как проверить пересечение диапазонов дат

/ 👁 68

Задача проверки пересечения диапазона дат довольно часто встречается в разработке. Например, нужно проверить не пересекается ли новое добавляемое событие с уже существующими по времени.

Если не знаешь, как это сделать, то по началу можно сломать себе голову. Но на самом деле всё не совсем не так сложно как кажется.

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

Проверяем пересечение диапазонов дат

Допустим у нас есть 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 'Не пересекаются';
}

То результат будет — «Не пересекаются».

В этом примере мы просто выводим текст, но на практике внутри условия вы можете делать, то, что требует ваша задача.

Надеюсь этот урок был вам полезен. До новых встреч.

Tags: ,

Leave a Reply