programing

날짜가 지정된 범위 내에 있는지 확인하려면 어떻게 해야 합니까?

kingscode 2023. 2. 1. 22:09
반응형

날짜가 지정된 범위 내에 있는지 확인하려면 어떻게 해야 합니까?

를 가지고 있는 경우$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 클래스를 사용합니다.사용하기 쉽고 기능이 향상되었습니다.

Date Time은 내부적으로 타임존을 지원하며 다른 솔루션은 사용자에게 달려 있습니다.

<?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);

문자열이 'YYY-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';

메모: 이와 같은 문자열 비교는 "비유효" 날짜(2009-13-32)와 이상한 형식의 문자열 "2009/3/3"를 사용할 수 있으므로 문자열 비교는 날짜 또는 타임스탬프 비교와 동일하지 않습니다.이것은 문자열의 날짜 값이 일관성 있고 표준 형식인 경우에만 작동합니다.

편집: 여기에 메모를 추가하여 당연한 내용을 자세히 설명합니다.

CONSISTENT란 예를 들어 비교되는 문자열은 동일한 형식이어야 합니다.달은 항상 2자, 날은 항상 2자, 구분자는 항상 대시여야 합니다.4자년, 2자월, 2자일이 아닌 문자열은 신뢰성 있게 비교할 수 없습니다.예를 들어 문자열에 한 글자와 두 글자의 달이 혼재되어 있으면 비교했을 때 예상치 못한 결과가 나올 수 있습니다.'2009-9-30'로.'2009-10-11'인간적으로는 '9'가 '10'보다 작다고 생각되지만 문자열 비교에서는'2009-9'보다 크다'2009-1'. 반드시 대시 구분 문자를 사용할 필요는 없습니다.따라서 마찬가지로 신뢰성 높은 방법으로 스트링을 비교할 수 있습니다.'YYYYMMDD'형식을 지정합니다. 구분자가 있는 경우 구분자는 항상 있어야 하며 항상 같아야 합니다.

CONATONAL은 문자열이 날짜 순서로 정렬되는 형식을 의미합니다.즉, 문자열은 먼저 "year", 다음으로 "month", 다음으로 "day"를 나타냅니다.에서는 스트링을 확실하게 비교할 수 없습니다.'MM-DD-YYYY'에서는, 「」합니다.MMYYYY되므로 (연간) 큰 입니다. 이 된 날짜는 문자열로 될 수 있습니다YYY-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
}

두 날짜를 모두 타임스탬프로 변환한 후 다음 작업 수행

의사 코드:

if date_from_user > start_date && date_from_user < end_date
    return true

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

$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);

이 방법이 가장 쉬웠습니다.

$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

  }
}

언급URL : https://stackoverflow.com/questions/976669/how-to-check-if-a-date-is-in-a-given-range

반응형