당신이있는 경우 $start_date
및 $end_date
사용자에 의해 주어진 날짜가 그 범위 내에있는 경우, 당신은 어떻게 확인할 수 있나요?
예 :
$start_date = '2009-06-17';
$end_date = '2009-09-05';
$date_from_user = '2009-08-28';
현재 날짜가 문자열 인 경우 타임 스탬프 정수로 변환하는 것이 도움이됩니까?
당신이있는 경우 $start_date
및 $end_date
사용자에 의해 주어진 날짜가 그 범위 내에있는 경우, 당신은 어떻게 확인할 수 있나요?
예 :
$start_date = '2009-06-17';
$end_date = '2009-09-05';
$date_from_user = '2009-08-28';
현재 날짜가 문자열 인 경우 타임 스탬프 정수로 변환하는 것이 도움이됩니까?
답변:
확실히를 이동하는 방법 사용, 타임 스탬프로되어 변환 한 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));
}
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);
2012-02-01
사이에있다 2012-02-01 ... 2014-04-30 23:59:59
.
DateTime
PHP가 즉시 제공하는 대략적인 시간 함수를 선호 합니다. 이 검사에 시작 및 종료 날짜를 포함하려면 반환 값을 다음으로 변경하면됩니다.return $date >= $startDate && $date <= $endDate;
문자열이 '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'이 허용되므로 문자열 비교는 다음과 같지 않습니다. 날짜 또는 타임 스탬프 비교. 이것은 문자열의 날짜 값이 CONSISTENT 및 CANONICAL 형식 인 경우에만 작동 합니다.
편집은 명백한에 정교화, 여기에 메모를 추가 할 수 있습니다.
으로 일관 달은 항상 날이 항상 두 개의 자 여야합니다, 두 문자이어야하며, 분리 문자는 항상 대시이어야합니다, 나는 문자열이 동일한 형식이어야 비교되는 것을 예를 들면 의미한다. 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
$startDatedt = strtotime($start_date)
$endDatedt = strtotime($end_date)
$usrDatedt = strtotime($date_from_user)
if( $usrDatedt >= $startDatedt && $usrDatedt <= $endDatedt)
{
//..falls within range
}
제공된 형식에서 사용자가 유효한 날짜를 제공 할만큼 똑똑하다고 가정하면 먼저 날짜로 변환 할 필요가 없으며 문자열로 비교할 수 있습니다.
$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";
}
날짜 또는 타임 스탬프 정수로 변환 한 다음 $ date_from_user가 <= $ end_date 및> = $ start_date인지 확인하십시오.
이것을 시도 할 수 있습니다.
//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);
iterator_to_array()
PHP 5.1부터 사용 가능
이 방법이 가장 쉬운 방법을 찾았습니다.
$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
}
}