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


294

PHP 문서를 살펴보면 다음 두 가지 DateTime객체 메소드 가 모두 내 문제를 해결하는 것처럼 보입니다.

이 두 가지 방법 모두 버전> = 5.3에서 사용 가능한 것으로 doco에 표시되어 있습니다. 5.2.8에 대한 특정 설명서를 찾을 수 없으므로 내 버전에 동등한 방법이 있는지 확실하지 않습니다. 나는 한 문제를 내 매우 간단한 요구 사항에 응답 어느 것도 솔루션의 취사 선택 범위를 발견 :

  • 두 개의 DateTime 객체를 어떻게 비교합니까?
  • 이전 PHP 버전의 doco는 어디에서 찾을 수 있습니까? 특히 버전 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
컴파일러가없는 경우 "error_reporting"을 "E_ALL"로 설정하면 "알림 : 정의되지 않은 변수 : start_dt in ..."와 같은 알림이 표시됩니다.
Milen A. Radev

5
또한 귀하의 $_POSTvars에 htmlentities를 사용하십시오 .
Clement Herreman

2
그리고 오류는 어디에 있습니까? : p, 나는 너무 U_U하고 있어요. 미리 감사드립니다!
castarco

2
@castarco $ st_dt를 초기화했지만 초기화되지 않은 $ start_dt와 비교합니다. 변수 이름을 확인하고 Milen의 제안을 따르고 error_reporting을 E_ALL로 설정하여 정의되지 않은 변수 경고를 받으십시오. :)
RedBlueThing

답변:


432

다음은 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:~#

7
고마워 Milen, 내가 틀린 가정을 제거하고 갑자기 내 코드의 눈부신 버그가 나에게 명백해 보였던 것처럼 보입니다.
RedBlueThing 2016 년

2
흠, 이것은 흥미 롭다. 어쩌면 우리는 사용자 정의 클래스에서 연산자를 오버로드 할 수 있습니다.
Ionuț G. Stan

1
에서 php.net/manual/en/language.operators.comparison.php 내장 클래스는 자신의 비교를 정의 할 수 있습니다, 다른 클래스는 uncomparable, 같은 클래스입니다 - 비교 속성 배열 (PHP 4)와 같은 방법으로, PHP 5는있다 자신의 설명
Saul

7
시간을 설정하지 않은 날짜 시간과 설정하지 않은 날짜 시간을 비교할 때주의하십시오 (기본 생성자)
max4ever

1
TiMESPLiNTER, 나는 당신이 날짜를 비교하는 데에만 관심이 있다면 시간이 다르다는 사실을 간과 할 수 있으므로 DateTime동일한 날짜를 가진 두 개의 시간이 동일한 것으로 비교되지 않을 것이라고 경고 합니다. 비교하기 전에 오브젝트의 시간 구성 요소를 명시 적으로 0으로 설정하여이를 해결할 수 있습니다.
Jason

52

에서 공식 문서 :

PHP 5.2.2부터 DateTime 객체는 비교 연산자를 사용하여 비교할 수 있습니다 .

$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
이 답변은 동작을 확인하고 결과가 예상되는 것으로 가정하는 대신 설명서를 인용하기 때문에 가장 잘 대답합니다. SO는 추측의 장소가 아닙니다. 브라보 로베르토.
cprn

3
@roberto DateTime :: diff 는 PHP 5.3에서만 추가되었습니다
NeXuS

30

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

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

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


16
stringformat생성 하므로 문자열 비교입니다. 1000000000 시대 (대략 2001 년 9 월 9 일) 이후에는 거의 문제가되지 않지만 그 전에 날짜를 처리 해야하는 경우 숫자 길이가 다르기 때문에 문제가 발생할 수 있습니다. 결과를 숫자로 변환하거나 (제한도 빼기) 또는과 같이 정렬 가능한 형식을 사용하십시오 . c
MaxArt

1
@MaxArt는 다른 문자열 길이로 인한 문제에 대해 자세히 설명해 주시겠습니까? 숫자 컨텍스트의 문자열 관련 매뉴얼 : "문자열에 '.', 'e'또는 'E'문자가 포함되지 않고 숫자 값이 정수 유형 제한 (PHP_INT_MAX에 정의 된대로)에 해당하는 경우 문자열 "정수로 평가됩니다. 다른 모든 경우에는 부동 소수점으로 평가됩니다." 향후 날짜 (약 2038 년)는 부호있는 32 비트 정수를 오버플로 할 수 있지만 이전 날짜의 문제는 무엇입니까?
Adrian Günter

1
@ AdrianGünter 문제는 숫자 컨텍스트에 있지 않지만 문자열을 처리한다는 것입니다. 입니다. 숫자이지만 여전히 문자열입니다. 따라서 문자열 비교가 이루어집니다.
MaxArt


2
@ FrédéricMarchal 네, 나중에 내 이전 의견이 실제로 거짓이라는 것을 나중에 배웠습니다. PHP는이 사례를 처리하는 정말 사악한 방법을 가지고 있습니다. 비교 할 두 문자열이있을 때 다른 언어 (내가 아는 것처럼)를 숫자로 변환하지 않습니다. 실제로 사전을 비교하고 싶다면 코드를 망치는 것입니다.
MaxArt

20

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

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

5
재설정 시간을 설정할 수도 있습니다. $d1->setTime(0, 0, 0);
Athlan

3

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

$aDate = new \DateTime('@'.(time()));
$bDate = new \DateTime('@'.(time() - 3600));

$aDate <=> $bDate; // => 1, `$aDate` is newer than `$bDate`

0
$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';
}

타임 스탬프에는 몇 가지 제한이 있습니다.이 stackoverflow.com/a/7229760/2652018
Steel Brain

알고 반갑습니다! 이것은 단순히 시간을 비교할 수있는 간단한 방법입니다.
Kyle Coots

-1

도움이 될 수 있습니다.

$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";
}

타임 스탬프에는 몇 가지 제한이 있습니다.이 stackoverflow.com/a/7229760/2652018
Steel Brain

@SteelBrain 당신은 타임 스탬프 제한이 모든 현재 날짜 시간을 갖는 위의 코드를 귀찮게한다고 생각합니까, 코드를 다시 읽으십시오. 기본적으로 항상 이번 달에있을 사람 $ expectedDate를 확인하십시오. 나는이 경우에 타임 스탬프 제한에 대해 생각해야한다고 생각하지 않습니다.
Tarun Gupta

나는 알고 있지만 권장하지는 않습니다. (
Steel Brain

권장되는 방법을 제안 할 수 있습니까?
Tarun Gupta

물론 $today = new DateTime("now"); $time = DateTime::createFromFormat('d-m-Y',"26-October-1998"); if ($today > $time){echo "today is greater";}else{echo "other time is greater";}건배.
스틸 브레인
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.