PHP, посмотрите, находится ли диапазон дат частично в другом диапазоне дат - PullRequest
6 голосов
/ 03 января 2012

Я всегда искал это, но ответ, кажется, никуда. Вот проблема:

Скажем, у меня есть два диапазона дат.

$daterange1 = 2012-04-20 till 2012-04-28 
$daterange2 = 2012-04-18 till 2012-05-01

Теперь я хотел бы знать, находится ли daterange2 в пределах daterange1. Но, как вы можете видеть, daterange2 только частично находится внутри daterange1. Есть ли способ вернуть 3 переменные, что-то вроде:

  1. 2012-04-18 до 2012-04-20
  2. 2012-04-20 до 2012-04-28
  3. 2012-04-28 до 2012-05-01

Я знаю, это звучит немного расплывчато, но я действительно не знаю, как объяснить это по-другому.

Ответы [ 3 ]

7 голосов
/ 04 января 2012

Вот пример использования класса PHP DateTime.Обратите внимание, что если вы передадите недопустимую строку даты в DateTime::__construct(), функция выдаст исключение, поэтому вы должны реализовать блок try / catch, если вас это беспокоит.Кроме того, я использую функции PHP min и max, поэтому не имеет значения, в каком порядке указаны даты.

$daterange1 = array('2012-04-20', '2012-04-28');
$daterange2 = array('2012-04-18', '2012-05-01');

$range_min = new DateTime(min($daterange1));
$range_max = new DateTime(max($daterange1));

$start = new DateTime(min($daterange2));
$end = new DateTime(max($daterange2));

if ($start >= $range_min && $end <= $range_max) {
  echo 'woot!';
} else {
  echo 'doh!';
}
5 голосов
/ 04 января 2012

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

Диапазон находится только частично в другом диапазоне, если:

  • дата начала диапазона1 равна> чем дата начала диапазона 2, но не> чем дата окончания диапазона 2
  • дата окончания диапазона 1 меньше даты окончания диапазона 2, но не <даты начала диапазона 2 </li>

Если один или оба из них являютсяtrue тогда диапазоны находятся в пределах друг друга.

0 голосов
/ 26 сентября 2017

Хотя это очень старый пост.Но все равно, если кто-то застрял.Вот полный пример перекрывающихся дат.

<?php
$daterange1 = array('2017-09-24', '2017-09-28');
$daterange2 = array('2017-09-22', '2017-09-25');

$range_min = new DateTime(min($daterange1));
$range_max = new DateTime(max($daterange1));

$start = new DateTime(min($daterange2));
$end = new DateTime(max($daterange2));

if ($start >= $range_min && $end <= $range_max) {
echo 'Overlapping!';
} 
else if($end > $range_min && $start < $range_max){
echo "partialy";
}
else {
echo 'free!';
}
?>
...