3v4l.org

run code in 300+ PHP versions simultaneously
<?php function range_overlap($range1, $range2) { list($start, $end) = explode(' - ', $range1); $start = new DateTime($start); $end = new DateTime($end); $start1 = min($start, $end); $end1 = max($start, $end); list($start, $end) = explode(' - ', $range2); $start = new DateTime($start); $end = new DateTime($end); $start2 = min($start, $end); $end2 = max($start, $end); // check for special cases if ($start1 >= $start2 && $end1 <= $end2) { // range1 completely contained inside range2 $overlap = $start1->diff($end1); } elseif ($start2 >= $start1 && $end2 <= $end1) { // range2 completely contained inside range1 $overlap = $start2->diff($end2); } elseif ($end2 > $end1) { // range1 ends first $overlap = $start2->diff($end1); } else { // range2 ends first $overlap = $start1->diff($end2); } // if overlap is < 0 then there is no overlap $overlap_days = $overlap->invert ? 0 : ($overlap->format('%a') + 1); echo "overlap is $overlap_days days\n"; } range_overlap('2019-01-01 - 2019-01-10', '2019-01-06 - 2019-01-20'); // 5 days range_overlap('2019-01-01 - 2019-03-20', '2019-05-06 - 2019-04-20'); // no overlap range_overlap('2019-01-10 - 2019-05-20', '2019-01-01 - 2019-05-20'); // 131 days range_overlap('2019-01-06 - 2019-01-20', '2019-01-10 - 2019-01-01'); // 5 days range_overlap('2019-01-30 - 2019-01-10', '2019-01-12 - 2019-01-15'); // 4 days range_overlap('2019-02-01 - 2019-03-20', '2019-01-10 - 2019-02-28'); // 28 days
Output for 7.1.25 - 7.1.33, 7.2.0 - 7.2.33, 7.3.0 - 7.3.33, 7.4.0 - 7.4.33, 8.0.0 - 8.0.30, 8.1.0 - 8.1.33, 8.2.0 - 8.2.29, 8.3.0 - 8.3.25, 8.4.1 - 8.4.12
overlap is 5 days overlap is 0 days overlap is 131 days overlap is 5 days overlap is 4 days overlap is 28 days

preferences:
118.47 ms | 408 KiB | 5 Q