Проверка на пересечение временных промежутков

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

После нескольких попыток сделать это логическим выражением, вспомнил, что можно найти длину пересечения отрезков на прямой. Получился элементарный алгоритм. Сначала переводим всё время в количество секунд, прошедших с эпохи UNIX, чтоб работать с временем, как с числами. А затем всё просто:

function is_intersect($t1, $t2, $t3, $t4) {
   $l = max($t1, $t3);
   $r = min($t2, $t4);
   return ($r - $l) > 0;
}

3 комментария

  1. Привет!
    Может быть корректнее написать >= 0 ? Если временные периоды пересеклись в одну секунду, длина «отрезка» будет 0.

    001111100000
    000000222000

    Я помню для меня стало «озарением» простое решение этой задачи за два сравнения, которое к тому же на SQL может использовать индекс:
    … WHERE a.start = b.start

Добавить комментарий

Ваш e-mail не будет опубликован.