2012-01-03 4 views
6

나는 영원히 이것을보고 있었지만 그 대답은 어디에도 없습니다. 문제는 다음과 같습니다.PHP, 날짜 범위의 일부가 다른 날짜 범위 내에 있는지 확인

두 가지 기간이 있습니다.

$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

나는이 질문을 이해하고 있으며, 모든 시간을'strtotime()'함수로 변환하고 비교하기를 원할 수도있다. 어쩌면'DateTime' 개체가 도움이 될지도 모릅니다. –

+0

범위가 범위 내에 있고 세 번째 변수가 –

답변

5

글쎄, 논리적으로 범위의 요구 사항을 부분적으로 다른 것으로 나눌 수 있습니다.

범위는 다른 범위 내에서 부분적으로 만되어있는 경우 :

  • 범위 1의 시작 날짜가 범위 2의 시작 날짜보다>는 있지만>
  • 범위 1의 종료 날짜 범위 2의 종료 날짜보다 <입니다 범위 2의 종료 날짜보다하지만 < ~ range2의 시작 날짜

둘 중 하나 또는 둘 다 맞으면 범위가 서로 같습니다.

7

다음은 PHP의 DateTime 클래스를 사용하는 예입니다. 잘못된 날짜 문자열을 DateTime::__construct()에 전달하면 함수에서 예외가 발생하므로 걱정할 필요가있는 경우 try/catch 블록을 구현해야합니다. 또한 PHP의 minmax 함수를 사용하여 날짜가 지정된 순서와 상관 없도록합니다.

$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!'; 
} 
0

이것은 매우 오래된 게시물이지만. 그러나 누군가가 붙어 있다면 여전히. 다음은 중복되는 날짜의 전체 예입니다.

<?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!'; 
} 
?>