복붙노트

PHP 5.2.8에서 DateTime 객체 두 개를 어떻게 비교합니까?

PHP

PHP 5.2.8에서 DateTime 객체 두 개를 어떻게 비교합니까?

이것은 꽤 솔직해야 할 것처럼 보이지만, 잠시 동안이 문제를 저지른 막힌 페이지가 있습니다. 그래서 여기에갑니다.

PHP 문서를 살펴보면 DateTime 객체의 다음 두 가지 방법으로 내 문제를 해결할 수 있습니다.

이 두 가지 방법 모두 doco에서 버전> = 5.3에서 사용할 수있는 것으로 표시되어 있습니다 (그리고 내가 전화하지 않으려 고 시도하면 당연히 존재하지 않습니다). 5.2.8에 대한 특정 설명서를 찾을 수 없으므로 동일한 버전의 도구가 있는지 확실하지 않습니다. 나는 그 문제를 인터넷 검색으로 해결할 수있는 해결책을 찾았는데, 그 중 어느 것도 내 간단한 요구 사항에 답하지 못했습니다.

일부 컨텍스트의 경우 다음 코드가 있습니다.

$st_dt = new DateTime(verifyParam ('start_date'));
$end_dt = new DateTime(verifyParam ('end_date'));

// is the end date more ancient than the start date?
if ($end_dt < $start_dt) 

분명히이 남자에 대한 비교 연산자가 없습니다.

편집 : 분명히 내 가정 완전히 거짓말 (너무 효과적으로 설명하기 위해 Milen 감사). 비교 연산자가 있으며 잘 작동합니다. 가끔 컴파일러가 그리워요. 위의 코드에있는 버그는 내가 찾은 것보다 훨씬 빨리 찾을 수있을 것이라고 확신합니다. :)

나는 당신의 솔루션의 단순함에 당황 스러울 것을 고대합니다.

편집 : 그리고 충분히, 당황은 계속된다 ...

해결법

  1. ==============================

    1.다음은 DateTime 클래스에 대한 비교 연산자가 있음을 확인하는 것 같습니다.

    다음은 DateTime 클래스에 대한 비교 연산자가 있음을 확인하는 것 같습니다.

    dev:~# php
    <?php
    date_default_timezone_set('Europe/London');
    
    $d1 = new DateTime('2008-08-03 14:52:10');
    $d2 = new DateTime('2008-01-03 11:11:10');
    var_dump($d1 == $d2);
    var_dump($d1 > $d2);
    var_dump($d1 < $d2);
    ?>
    bool(false)
    bool(true)
    bool(false)
    dev:~# php -v
    PHP 5.2.6-1+lenny3 with Suhosin-Patch 0.9.6.2 (cli) (built: Apr 26 2009 20:09:03)
    Copyright (c) 1997-2008 The PHP Group
    Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies
    dev:~#
    
  2. ==============================

    2.공식 문서에서 :

    공식 문서에서 :

    $date1 = new DateTime("now");
    $date2 = new DateTime("tomorrow");
    
    var_dump($date1 == $date2); // false
    var_dump($date1 < $date2); // true
    var_dump($date1 > $date2); // false
    

    5.2.2 이전의 PHP 버전 (실제로는 모든 버전)에서 diff를 사용할 수 있습니다.

    $datetime1 = new DateTime('2009-10-11'); // 11 October 2013
    $datetime2 = new DateTime('2009-10-13'); // 13 October 2013
    
    $interval = $datetime1->diff($datetime2);
    echo $interval->format('%R%a days'); // +2 days
    
  3. ==============================

    3.또한 에포크 초를 비교할 수도 있습니다.

    또한 에포크 초를 비교할 수도 있습니다.

    $d1->format('U') < $d2->format('U')
    

    출처 : http://laughingmeme.org/2007/02/27/looking-at-php5s-datetime-and-datetimezone/ (DateTime에 관한 아주 흥미로운 기사)

  4. ==============================

    4.시간이 아닌 날짜를 비교하려면 다음을 사용할 수 있습니다.

    시간이 아닌 날짜를 비교하려면 다음을 사용할 수 있습니다.

    $d1->format("Y-m-d") == $d2->format("Y-m-d")
    
  5. ==============================

    5.

    $elapsed = '2592000';
    // Time in the past
    $time_past = '2014-07-16 11:35:33';
    $time_past = strtotime($time_past);
    
    // Add a month to that time
    $time_past = $time_past + $elapsed;
    
    // Time NOW
    $time_now = time();
    
    // Check if its been a month since time past
    if($time_past > $time_now){
        echo 'Hasnt been a month';    
    }else{
        echo 'Been longer than a month';
    }
    
  6. ==============================

    6.이것은 당신을 도울 수 있습니다.

    이것은 당신을 도울 수 있습니다.

    $today = date("m-d-Y H:i:s");
    $thisMonth =date("m");
    $thisYear = date("y");
    $expectedDate = ($thisMonth+1)."-08-$thisYear 23:58:00";
    
    
    if (strtotime($expectedDate) > strtotime($today)) {
        echo "Expected date is greater then current date";
        return ;
    } else
    {
     echo "Expected date is lesser then current date";
    }
    
  7. ==============================

    7.PHP 7.x부터 다음을 사용할 수 있습니다 :

    PHP 7.x부터 다음을 사용할 수 있습니다 :

    $aDate = new \DateTime('@'.(time()));
    $bDate = new \DateTime('@'.(time() - 3600));
    
    $aDate <=> $bDate; // => 1, `$aDate` is newer than `$bDate`
    
  8. from https://stackoverflow.com/questions/961074/how-do-i-compare-two-datetime-objects-in-php-5-2-8 by cc-by-sa and MIT license