주어진 날짜와 오늘 비교


216

나는 다음과 같은

$var = "2010-01-21 00:00:00.0"

이 날짜와 오늘 날짜를 비교하고 싶습니다 (즉, $var오늘이 오늘인지 또는 오늘과 같은지 알고 싶습니다 )

어떤 기능을 사용해야합니까?


5
나는 또한 시간대를 설정하는 것이 좋습니다
NJInamdar

답변:


289
strtotime($var);

시간 값으로 바꿉니다

time() - strtotime($var);

이후 초를 제공합니다 $var

if((time()-(60*60*24)) < strtotime($var))

$var마지막 날이 지 났는지 확인합니다 .


1
PHP 4는 마지막 종료 '0.0'$ VAR에서 = "2010-01-21 00 : 00 : 00.0", 그렇지 않으면, strtotime으로 반환 -1
vivoconunxino

1
PHP 7.1을 사용하고 있습니다. 리턴 값이 초 수의 정수인 경우 서브 초 부분은 무시됩니다.
Diogo Melo 2016 년

209

이 형식은 표준 문자열 비교에 완벽하게 적합합니다.

if ($date1 > $date2){
  //Action
}

해당 날짜 형식으로 오늘 날짜를 얻으려면 다음을 사용하십시오 date("Y-m-d H:i:s").

그래서:

$today = date("Y-m-d H:i:s");
$date = "2010-01-21 00:00:00";

if ($date < $today) {}

그것은 그 형식의 아름다움입니다. 물론, 그 수 있습니다 당신의 정확한 상황에 따라, 덜 효율적뿐만 아니라 훨씬 더 편리하고 더 유지 보수 코드로 이어질 수 있습니다 - 우리는 더 많은 진정으로 알고 판단 전화를해야 할 것입니다.

올바른 시간대의 경우 예를 들어

date_default_timezone_set('America/New_York');

사용 가능한 PHP 시간대를 참조 하려면 여기클릭하십시오 .


2
이것은 또한 시간대를 무시합니다
anushr

@anushr, 비교에 시간대가 필요한 경우 비교 전에 날짜에 시차를 추가 할 수 있습니다. 이것은 mm/dd/yyyy형식으로 두 개의 날짜 시간 문자열을 날짜로 변환 한 다음 비교하는 것보다 여전히 빠릅니다 . 개발자가 시스템에서 여러 시간대의 날짜를 가질 때 항상 걱정합니다. 시스템에 날짜를 항상 단일 시간대로 저장 한 다음 필요한 시간대로 표시하는 것이 좋습니다. 나는 1998 년경 SQL 서버에서도 훨씬 빨리 정렬한다는 것을 깨달았을 때 yyyy-mm-dd형식 (또는 yyyymmdd)을 사용하기 시작했습니다 .
AaA

59

여기 있습니다 :

function isToday($time) // midnight second
{
    return (strtotime($time) === strtotime('today'));
}

isToday('2010-01-22 00:00:00.0'); // true

또한 더 많은 도우미 기능이 있습니다.

function isPast($time)
{
    return (strtotime($time) < time());
}

function isFuture($time)
{
    return (strtotime($time) > time());
}

왜 이상한 역 논리와 외래 부울입니까? 왜 "reto strtotime ($ time) == strtotime ( 'today')", "return strtotime ($ time)> time ()"및 "return strtotime ($ time) <time ()"이 아닌가?
Bobby Jack

@Bobby Jack : 그 기능에 더 많은 기능이 있었고 추가 코드를 삭제하는 것을 잊었습니다. 지금 수정했습니다.
Alix Axel

도우미 기능에 +1, 특히 isPast b / c 방금 a를 실행하여 if(strtotime('2013-01-22 00:00:00.00') < time()){....}그 작업을 수행했습니다.
MDMoore313

47

PHP 5.2.2 이상이있는 경우 BoBby Jack을 완료하려면 DateTime OBject를 사용하십시오.

if(new DateTime() > new DateTime($var)){
    // $var is before today so use it

}

이것은 정확하지 않습니다. $ var가 현재 날짜 (정확한 자정 이후)이면 new DateTime ()이 new DateTime ($ var)보다 크며 $ var가 오늘 이전 인 것은 아닙니다.
dxvargas

46

당신은 DateTime수업을 사용할 수 있습니다 :

$past   = new DateTime("2010-01-01 00:00:00");
$now    = new DateTime();
$future = new DateTime("2021-01-01 00:00:00");

비교 연산자 작동 * :

var_dump($past   < $now);         // bool(true)
var_dump($future < $now);         // bool(false)

var_dump($now == $past);          // bool(false)
var_dump($now == new DateTime()); // bool(true)
var_dump($now == $future);        // bool(false)

var_dump($past   > $now);         // bool(false)
var_dump($future > $now);         // bool(true)

DateTime 객체에서 타임 스탬프 값을 가져 와서 비교할 수도 있습니다.

var_dump($past  ->getTimestamp());                        // int(1262286000)
var_dump($now   ->getTimestamp());                        // int(1431686228)
var_dump($future->getTimestamp());                        // int(1577818800)
var_dump($past  ->getTimestamp() < $now->getTimestamp()); // bool(true)
var_dump($future->getTimestamp() > $now->getTimestamp()); // bool(true)

* ===두 개의 다른 DateTime 객체가 동일한 날짜를 나타내는 경우에도 비교할 때는 false 를 반환합니다.


$future과거가되었습니다. : P
mbomb007

나의, 시간은 어떻게되는지.
Salman A

13
$toBeComparedDate = '2014-08-12';
$today = (new DateTime())->format('Y-m-d'); //use format whatever you are using
$expiry = (new DateTime($toBeComparedDate))->format('Y-m-d');

var_dump(strtotime($today) > strtotime($expiry)); //false or true

그것은 $varOP에서도 저 와 동등한 것이 아닙니다
alexus

1
그리고 (new DateTime ())-> format ( 'Ym-d')에 대해 PHP> = 5.4가 필요합니다.
webrama.pl

6

내 경험에 근거한 한 가지주의 사항, 만약 당신의 목적에만 날짜가 포함되어 있다면 타임 스탬프를 포함하도록주의하십시오 . 예를 들어 오늘이라고합니다 "2016-11-09". 타임 스탬프와 관련된 비교는 여기서 논리를 무효화합니다. 예,

//  input
$var = "2016-11-09 00:00:00.0";

//  check if date is today or in the future
if ( time() <= strtotime($var) ) 
{
    //  This seems right, but if it's ONLY date you are after
    //  then the code might treat $var as past depending on
    //  the time.
}

위의 코드는 옳아 보이지만 비교하려는 날짜 만 있다면 위의 코드가 올바른 논리가 아닙니다. 왜? time () 및 strtotime ()은 타임 스탬프 포함을 제공하기 때문입니다. 즉, 두 날짜가 같은 날에 있지만 시간의 차이가 중요합니다. 아래 예를 고려하십시오.

//  plain date string
$input = "2016-11-09";

입력은 일반 날짜 문자열이므로 strtotime()on $input을 사용 하면 2016-11-09의 자정이라고 가정합니다. 따라서 time()자정 이후에 언제든지 실행 $input하면 같은 날에 있더라도 항상 과거로 간주 됩니다.

이 문제를 해결하려면 다음과 같이 간단히 코딩하면됩니다.

if (date("Y-m-d") <= $input)
{
    echo "Input date is equal to or greater than today.";
}

1
OP가 이것을 고려한 것이 확실하기 때문에 그들이 질문에 '00 : 00 : 00.0 '을 포함 시켰습니다
AaA

6

몇 년 후, 나는 지난 24 시간이 오늘이 아니라는 Bobby Jack의 관찰을 두 번째로 !!! 그리고 그 대답이 너무 많이 찬란하다는 것에 놀랐습니다 ...

특정 날짜가 다른 날짜보다 작거나 같거나 큰지 비교하려면 먼저 날짜를 "시작"으로 시작해야합니다. 다시 말해, 두 날짜 모두에 동일한 00:00:00 시간에 대해 이야기하고 있는지 확인하십시오. 다음과 같이 간단하고 우아하게 수행 할 수 있습니다.

strtotime("today") <=> strtotime($var)

경우는 $var지정된 OP 같은 0시 0분 0초의 시간 부분이있다.

바꾸다 <=> 당신이 필요로하는 무엇 이건 (또는 PHP에서 이런 식으로 계속 7)

또한, 우리는 둘 다 동일한 시간대에 대해 이야기하고 있습니다. 위해 지원하는 시간대의 목록


5
$date1=date_create("2014-07-02");
$date2=date_create("2013-12-12");
$diff=date_diff($date1,$date2);

(w3schools 예, 완벽하게 작동합니다)


4

w3schools의 Josua 답변 확대 :

//create objects for the dates to compare
$date1=date_create($someDate);
$date2=date_create(date("Y-m-d"));
$diff=date_diff($date1,$date2);
//now convert the $diff object to type integer
$intDiff = $diff->format("%R%a");
$intDiff = intval($intDiff);
//now compare the two dates
if ($intDiff > 0)  {echo '$date1 is in the past';}
else {echo 'date1 is today or in the future';}

이게 도움이 되길 바란다. stackoverflow에 대한 첫 번째 게시물!


1

날짜 시간 객체 비교 :

(10 일을 선택했습니다. 10 일보다 오래된 것은 "OLD", 그렇지 않으면 "NEW")

$now   = new DateTime();
$diff=date_diff($yourdate,$now);
$diff_days = $diff->format("%a");
if($diff_days > 10){
    echo "OLD! " . $yourdate->format('m/d/Y');
}else{
    echo "NEW! " . $yourdate->format('m/d/Y');
}

1

주어진 답변 중 일부는 현재 날짜를 고려하지 않았습니다!

여기 내 제안이 있습니다.

$var = "2010-01-21 00:00:00.0"
$given_date = new \DateTime($var);

if ($given_date == new \DateTime('today')) {
  //today
}

if ($given_date < new \DateTime('today')) {
  //past
}

if ($given_date > new \DateTime('today')) {
  //future
}

0

시간과 날짜가있는 일을 하면 Carbon 이 가장 친한 친구입니다.

그런 다음 패키지를 설치하십시오.

$theDay = Carbon::make("2010-01-21 00:00:00.0");

$theDay->isToday();
$theDay->isPast();
$theDay->isFuture();
if($theDay->lt(Carbon::today()) || $theDay->gt(Carbon::today()))

lt =보다 작음, gt =보다 큼

질문에서와 같이 :

$theDay->gt(Carbon::today()) ? true : false;

그리고 훨씬 더;

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