날짜가 주어진 범위에 있는지 확인하는 방법은 무엇입니까?


86

당신이있는 경우 $start_date$end_date사용자에 의해 주어진 날짜가 그 범위 내에있는 경우, 당신은 어떻게 확인할 수 있나요?

예 :

$start_date = '2009-06-17';

$end_date = '2009-09-05';

$date_from_user = '2009-08-28'; 

현재 날짜가 문자열 인 경우 타임 스탬프 정수로 변환하는 것이 도움이됩니까?


도움이 될 것입니다. 그러면 날짜 조작 기능에 액세스 할 수 있습니다.
ChrisF

3
Unix 타임 스탬프가 1970 년 1 월 1 일 (1970-01-01) 인 epoch에서 시작하므로 타임 스탬프 제한에주의하십시오. 따라서 1970 년 이전의 테스트 날짜에 대해 재미있는 동작을 할 수 있습니다.
Shadi Almosri

1
@Shadi 음수와 같은 것이 있다는 것을 알고 있습니까?
Jeremy Logan

@fiXedd 동일한 기본 문제가 존재합니다. 음수 타임 스탬프를 허용하더라도 32 비트 타임 스탬프는 1902 년 이전의 날짜를 나타낼 수 없습니다.
Frank Farmer

답변:


123

확실히를 이동하는 방법 사용, 타임 스탬프로되어 변환 한 strtotime를 , 예를 들어,

$start_date = '2009-06-17';

$end_date = '2009-09-05';

$date_from_user = '2009-08-28';

check_in_range($start_date, $end_date, $date_from_user);


function check_in_range($start_date, $end_date, $date_from_user)
{
  // Convert to timestamp
  $start_ts = strtotime($start_date);
  $end_ts = strtotime($end_date);
  $user_ts = strtotime($date_from_user);

  // Check that user date is between start & end
  return (($user_ts >= $start_ts) && ($user_ts <= $end_ts));
}

1
잘 작동합니다. 감사.
GeneCode

48

PHP 5.3 이상이있는 경우 DateTime 클래스를 사용하십시오. 사용하기 쉽고 더 나은 기능.

DateTime은 내부적으로 시간대를 지원하며 다른 솔루션은이를 처리 할 수 ​​있습니다.

<?php    
/**
 * @param DateTime $date Date that is to be checked if it falls between $startDate and $endDate
 * @param DateTime $startDate Date should be after this date to return true
 * @param DateTime $endDate Date should be before this date to return true
 * return bool
 */
function isDateBetweenDates(DateTime $date, DateTime $startDate, DateTime $endDate) {
    return $date > $startDate && $date < $endDate;
}

$fromUser = new DateTime("2012-03-01");
$startDate = new DateTime("2012-02-01 00:00:00");
$endDate = new DateTime("2012-04-30 23:59:59");

echo isDateBetweenDates($fromUser, $startDate, $endDate);

세 개의 매개 변수를 취하고 부울을 반환하는 함수로 이것을 변환 할 수 있습니다. 테스트하기가 매우 쉬워야합니까?
oldwizard 2015

나는 함수에 대해 true를 반환해야한다고 말할 것 2012-02-01사이에있다 2012-02-01 ... 2014-04-30 23:59:59.
Salman A

2
나는 항상 DateTimePHP가 즉시 제공하는 대략적인 시간 함수를 선호 합니다. 이 검사에 시작 및 종료 날짜를 포함하려면 반환 값을 다음으로 변경하면됩니다.return $date >= $startDate && $date <= $endDate;
zanderwar

@zanderway> 기본값은 초 비교가 아닌 "일"비교로 설정되어 있습니까? $ startDate에 초가 지정되어 있으므로 "> ="가 정말로 필요한지 궁금합니다.
PJ Brunet

46

문자열이 'YYYY-MM-DD'표준 형식의 날짜로 유효성이 검사되므로 비교를 위해 타임 스탬프로 변환 할 필요가 없습니다.

이 테스트는 다음과 같이 작동합니다.

( ( $date_from_user >= $start_date ) && ( $date_from_user <= $end_date ) )

주어진:

$start_date     = '2009-06-17';
$end_date       = '2009-09-05';
$date_from_user = '2009-08-28';

참고 : 이와 같은 문자열을 비교하면 "유효하지 않은"날짜 (예 : 12 월 32 일) '2009-13-32'및 이상한 형식의 문자열 '2009/3/3'이 허용되므로 문자열 비교는 다음과 같지 않습니다. 날짜 또는 타임 스탬프 비교. 이것은 문자열의 날짜 값이 CONSISTENTCANONICAL 형식 인 경우에만 작동 합니다.

편집은 명백한에 정교화, 여기에 메모를 추가 할 수 있습니다.

으로 일관 달은 항상 날이 항상 두 개의 자 여야합니다, 두 문자이어야하며, 분리 문자는 항상 대시이어야합니다, 나는 문자열이 동일한 형식이어야 비교되는 것을 예를 들면 의미한다. 4 문자 연도, 2 문자 월, 2 문자 일이 아닌 "문자열"을 안정적으로 비교할 수 없습니다. 우리가 하나 개의 문자와 문자열의 두 문자 개월의 혼합을 가지고 있다면 우리가 비교했을 때, 예를 들어, 우리는 예상치 못한 결과를 얻을 것 '2009-9-30'까지 '2009-10-11'. 인간적으로 "9"는 "10"보다 작은 것으로 간주하지만 문자열 비교는 '2009-9'보다 큰 것으로 간주 '2009-1'합니다. 반드시 대시 구분 문자를 사용할 필요는 없습니다. 문자열을 안정적으로 비교할 수 있습니다.'YYYYMMDD'체재; 구분 문자가 있으면 항상 거기에 있어야하며 항상 동일해야합니다.

에 의해 CANONICAL , 나는 날짜 순서로 정렬됩니다 문자열을 초래할 것이다 형식을 의미한다. 즉, 문자열은 먼저 "연도", "월", "일"순으로 표시됩니다. 'MM-DD-YYYY'표준이 아니기 때문에 형식에서 문자열을 안정적으로 비교할 수 없습니다 . 문자열 비교는 왼쪽에서 오른쪽으로 작동하므로 MM비교하기 전의 (월) YYYY(연도)을 비교합니다.) 'YYYY-MM-DD'문자열 형식의 큰 이점은 이것이 표준이라는 것입니다. 이 형식으로 표시된 날짜는 문자열로 안정적으로 비교할 수 있습니다.

[추가]

PHP 타임 스탬프 변환을 수행하는 경우 제한 사항에 유의하십시오.

일부 플랫폼에서 php는 1970-01-01 이전 및 / 또는 2038-01-19 이후의 타임 스탬프 값을 지원하지 않습니다. (이것이 유닉스 타임 스탬프 32 비트 정수의 특성입니다.) 이후 버전의 pf php (5.3?)는이 문제를 해결해야합니다.

문자열에서 타임 스탬프로 변환하거나 타임 스탬프에서 다시 문자열로 변환 할 때 동일한 시간대를 사용하는 데주의하지 않는 경우 시간대도 문제가 될 수 있습니다.

HTH


1
캐스팅하지 않고 $ date_from_user, $ start_date 또는 $ end_date의 값이 날짜가 아닌 경우 문제가 발생할 수 있습니다. ie $ end_date = 'Balh Blah'.. 확실히 제대로 작동하지 않습니다
Mike Dinescu

@ spencer7593,이 동작에 대한 몇 가지 참조가 있습니까?
누트 G. 스탠

2
checkdate ()를 사용하여 유효성을 검사 할 수 있습니다
meleyal

이것은 시간과 함께 작동합니까? 내 말은, HH : MM : SS 형식으로 두 번 있고 주어진 시간이이 둘 사이에 있는지 알고 싶습니다.
앤디 이바

1
@Sergio : 예, 문자열이 표준 표준 형식 (예 : 24 시간 시계, 자정은 '00 : 00 : 00 '으로 표시되고 자정 이전의 마지막 초는'로 표시됨) 인 한 시간 값에 대해 동일한 문자열 비교가 작동합니다. 23:59:59 '문자열 비교가 "작동"하도록 보장하려면 시간 값의 문자열 표현이 보장 된 형식인지 확인해야합니다.
spencer7593

4
$startDatedt = strtotime($start_date)
$endDatedt = strtotime($end_date)
$usrDatedt = strtotime($date_from_user)

if( $usrDatedt >= $startDatedt && $usrDatedt <= $endDatedt)
{
   //..falls within range
}

시작 날짜 또는 종료 날짜와 정확히 일치하는 항목은 포함되지 않습니다
TheTXI

OP는 포괄적 인 일치를 요구하지 않았습니다.
Jeremy Logan

3

두 날짜를 타임 스탬프로 변환 한 다음

의사 코드 :

if date_from_user > start_date && date_from_user < end_date
    return true

범위에 start_date 및 end_date도 포함하도록 편집 할 수 있습니다. 지금은 date_from_user가 둘 중 하나이면 계산되지 않습니다.
TheTXI

OP는 포괄적 또는 배타적 범위를 지정하지 않았으므로 사용할 전략을 선택하는 것은 그들에게 맡기겠습니다
Glen

3

제공된 형식에서 사용자가 유효한 날짜를 제공 할만큼 똑똑하다고 가정하면 먼저 날짜로 변환 할 필요가 없으며 문자열로 비교할 수 있습니다.


1
날짜가 이미 검증 된 코드에서이 점으로
meleyal

3
$start_date="17/02/2012";
$end_date="21/02/2012";
$date_from_user="19/02/2012";

function geraTimestamp($data)
{
    $partes = explode('/', $data); 
    return mktime(0, 0, 0, $partes[1], $partes[0], $partes[2]);
}


$startDatedt = geraTimestamp($start_date); 
$endDatedt = geraTimestamp($end_date);
$usrDatedt = geraTimestamp($date_from_user);

if (($usrDatedt >= $startDatedt) && ($usrDatedt <= $endDatedt))
{ 
    echo "Dentro";
}    
else
{
    echo "Fora";
}

2

날짜 또는 타임 스탬프 정수로 변환 한 다음 $ date_from_user가 <= $ end_date 및> = $ start_date인지 확인하십시오.


3
'날짜로 변환'을 명확히 할 수 있습니까? 어떻게 하시겠습니까? PHP에 날짜 유형이 없다고 생각 했습니까?
meleyal 09

2

이것을 시도 할 수 있습니다.

//custom date for example
$d1 = new DateTime("2012-07-08");
$d2 = new DateTime("2012-07-11");
$d3 = new DateTime("2012-07-08");
$d4 = new DateTime("2012-07-15");

//create a date period object
$interval = new DateInterval('P1D');
$daterange = iterator_to_array(new DatePeriod($d1, $interval, $d2));
$daterange1 = iterator_to_array(new DatePeriod($d3, $interval, $d4));
array_map(function($v) use ($daterange1) { if(in_array($v, $daterange1)) print "Bingo!";}, $daterange);

1
버전 노트 : iterator_to_array()PHP 5.1부터 사용 가능
Raptor

0

이 방법이 가장 쉬운 방법을 찾았습니다.

$start_date = '2009-06-17';
$end_date = '2009-09-05';
$date_from_user = '2009-08-28';

$start_date = date_create($start_date);
$date_from_user = date_create($date_from_user);
$end_date = date_create($end_date);

$interval1 = date_diff($start_date, $date_from_user);
$interval2 = date_diff($end_date, $date_from_user);

if($interval1->invert == 0){
  if($interval2->invert == 1){

     // if it lies between start date and end date execute this code

  }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.