PHP에서 두 날짜를 어떻게 비교할 수 있습니까?


125

PHP에서 두 날짜를 어떻게 비교할 수 있습니까?

날짜는 다음 형식으로 데이터베이스에 저장됩니다.

2011-10-2

오늘 날짜를 데이터베이스의 날짜와 비교하여 더 큰 날짜를 확인하려면 어떻게해야합니까?

나는 이것을 시도했다.

$today = date("Y-m-d");
$expire = $row->expireDate //from db

if($today < $expireDate) { //do something; }

하지만 실제로는 그렇게 작동하지 않습니다. 다른 방법은 무엇입니까?


db 날짜를 DateTime 개체에 할당 한 다음 해당 개체를 비교합니다. stackoverflow.com/questions/961074/
Peter

답변:


80

데이터베이스에서 날짜는 다음과 같습니다. 2011-10-2

YYYY-MM-DD에 저장하면 '1'> '0'등으로 문자열 비교가 작동합니다.


2
그러나 2011-10-02 및 2012-02-10, 월 비교 1> 0이지만 2011-10-02 <2012-02-10
dav

14
@Davo, 비교는 다른 첫 번째 문자에서 중지됩니다. 이 경우 '1'< '2'의 네 번째 숫자이므로 원하는 결과를 얻을 수 있습니다.
Matthew

1
미안합니다 :), 충분히 조심하지 않았습니다.
dav

다음이 작동 2016-03-27 11:59:47 ::: 2016-03-14 10:30:00합니까?
shorif2000

221

모든 날짜가 1970 년 1 월 1 일 이후 인 경우 다음과 같이 사용할 수 있습니다.

$today = date("Y-m-d");
$expire = $row->expireDate; //from database

$today_time = strtotime($today);
$expire_time = strtotime($expire);

if ($expire_time < $today_time) { /* do Something */ }

PHP 5> = 5.2.0을 사용하는 경우 DateTime 클래스를 사용할 수 있습니다.

$today_dt = new DateTime($today);
$expire_dt = new DateTime($expire);

if ($expire_dt < $today_dt) { /* Do something */ }

또는이 선을 따라 뭔가.


내가 올바르게 기억한다면,이 문제는 Windows에서1st of January of 1970 실행되는 이전 버전의 PHP에만 적용 되며 Unix에서는 문제가되지 않았습니다.
Álvaro González

나는이 대답을 좋아한다. 그것은 한 strtotime에 좋은 선택이 변환 날짜를 ()입니다
에리히 가르시아

2
지금은 "모든 날짜가 1970 년 1 월 1 일 이후 인 경우"와 "2038 년 이전"이 아닐까요? y2k38 버그를 확인하십시오. strtotime더 큰 날짜에 대해 false를 반환합니다. stackoverflow.com/questions/2012589/…
blamb

DateTime방법이 선호되는 방법입니다. 그 객체는 그 strtotime어느 때보 다 훨씬 많은 일을 할 수 있습니다.
Machavity

new DateTime('now')또한 오늘 날짜 검색 작업
Breith

23

이미 주어진 답변을 칭찬하려면 다음 예를 참조하십시오.

$today = new DateTime('');
$expireDate = new DateTime($row->expireDate); //from database



if($today->format("Y-m-d") < $expireDate->format("Y-m-d")) { 
    //do something; 
}

업데이트 : 또는 구식 date () 함수를 사용하십시오.

if(date('Y-m-d') < date('Y-m-d', strtotime($expire_date))){
    //echo not yet expired! 
}   

1
날짜는 클래스 / 생성자가 아닌 함수입니다.
spdionis 2015

2
@spdionis 의견에 감사드립니다. 혼란을 없애기 위해 대문자를 변경했습니다.
d.raev

6

나는 PHP로 이것을하지 않을 것이다. 데이터베이스는 오늘이 무엇인지 알아야합니다. (예를 들어 MySQL-> NOW () 사용) 사용 된 날짜 유형에 따라 문제없이 Query 내에서 비교하고 결과를 반환하는 것이 매우 쉽습니다.

SELECT IF(expireDate < NOW(),TRUE,FALSE) as isExpired FROM tableName

감사하지만 난 사실은 내가는 DB에 저장 오늘날의 날짜를 해달라고 날짜를 ()를 사용
사르 멘 B.

4
그러나 expireDate를 db에 저장합니다. 이 날짜를 NOW ()와 비교
Dr.Molle

4
$today = date('Y-m-d');//Y-m-d H:i:s
$expireDate = new DateTime($row->expireDate);// From db 
$date1=date_create($today);
$date2=date_create($expireDate->format('Y-m-d'));
$diff=date_diff($date1,$date2);

//echo $timeDiff;
if($diff->days >= 30){
    echo "Expired.";
}else{
    echo "Not expired.";
}

2

두 날짜차이 를 분 단위 로 얻는 방법은 다음과 같습니다 .

// set dates
$date_compare1= date("d-m-Y h:i:s a", strtotime($date1));
// date now
$date_compare2= date("d-m-Y h:i:s a", strtotime($date2));

// calculate the difference
$difference = strtotime($date_compare1) - strtotime($date_compare2);
$difference_in_minutes = $difference / 60;

echo $difference_in_minutes;

질문은 두 날짜를 비교하는 것입니다. 귀하의 답변은 질문에 대한 답변으로 필요하지 않은 추가 항목 (예 : 온라인 / 오프라인 상태 설정)을 추가하는 것입니다. 비교가 이루어지는 답변의 일부는 여기에 이미 존재하는 답변과 거의 동일 합니다 .
crazyloonybin

질문을 업데이트하고 잘못된 질문에 잘못된 답변을 게시했습니다 ^^;) 답변과 동일하지 않으며 비교 방법에 대한 의견을 추가하고 몇 분 안에 차이를 얻습니다.
Syno

1
나는 :) 훨씬 좋아 보이는 때문에 당신의 갱신의 내 downvote을 제거 한
crazyloonybin

2

날짜를 UNIX 타임 스탬프로 변환하고 그 차이를 초 단위로 비교할 수 있습니다.

$today_date=date("Y-m-d");
$entered_date=$_POST['date'];
$dateTimestamp1 = strtotime($today_date);
$dateTimestamp2 = strtotime($entered_date);
$diff= $dateTimestamp1-$dateTimestamp2;
//echo $diff;
if ($diff<=0)
   {
     echo "Enter a valid date";
   }

0

나도 그 문제가 있었고 다음과 같이 해결했습니다.

$today = date("Ymd");
$expire = str_replace('-', '', $row->expireDate); //from db

if(($today - $expire) > $NUMBER_OF_DAYS) 
{ 
    //do something; 
}

이 기술이 작동하는 이유는 답변에 설명되어야합니다.
mickmackusa

자신의 고유 한 시나리오를 어떻게 해결했는지가 아니라 OP의 게시 된 질문에 답하십시오.
mickmackusa

0

다음은 PHP로 두 날짜 사이의 날짜 차이를 얻는 방법에 대한 내 스핀입니다. '!'의 사용에 유의하십시오. DateTime createFromFormat의 정보 덕분에 날짜의 시간 부분을 버리는 형식으로 시간이 없습니다 .

$today = DateTime::createFromFormat('!Y-m-d', date('Y-m-d'));
$wanted = DateTime::createFromFormat('!d-m-Y', $row["WANTED_DELIVERY_DATE"]);
$diff = $today->diff($wanted);
$days = $diff->days;
if (($diff->invert) != 0) $days = -1 * $days;
$overdue = (($days < 0) ? true : false);
print "<!-- (".(($days > 0) ? '+' : '').($days).") -->\n";

-1

블로그에서 답을 찾았으며 다음과 같이 간단합니다.

strtotime(date("Y"."-01-01")) -strtotime($newdate))/86400

그리고 두 날짜 사이의 날짜를 얻을 수 있습니다.


이것은 다른 문제를 해결하는 것으로 보입니다. OP에서 요청한 질문에만 답하십시오.
mickmackusa

-1

이것은 PHP의 문자열 비교 논리 때문에 작동합니다. 간단히 확인할 수 있습니다 ...

if ($startdate < $date) {// do something} 
if ($startdate > $date) {// do something}

두 날짜는 동일한 형식이어야합니다. 숫자는 왼쪽으로 0으로 채워야하며 최상위에서 최하위 순으로 정렬되어야합니다. Y-m-d그리고 Y-m-d H:i:s이러한 조건을 만족시킨다.


1
d-m-Y작동하지 않습니다. Y-m-d(2016-05-08과 같이 앞에 0이 있음) 작동합니다. 에 그 날짜 확인 d-m-Y형식 01-10-201620-02-2016..., 비교 문자열 0 <2, 그것은 것 정지로 비교하지만 잘못
Arxeiss

다음은 귀하의 기술이 오늘 날짜와 OP 날짜를 올바르게 비교하지 못할 것이라는 증거입니다. 3v4l.org/SNHKT
mickmackusa

OP의 날짜 형식이 다릅니다. 날짜는 다음과 같습니다 2011-10-2.
mickmackusa

-1

암호 재설정을 수행 할 때 토큰 만료 날짜와 같이 일정 간격으로 날짜 ($ date)가 만료되도록하려면 다음과 같이하십시오.

$date = $row->expireDate;

$date->add(new DateInterval('PT24H')); // adds 24 hours

$now = new \DateTime();

if($now < $date) { /* expired after 24 hours */ }

그러나 귀하의 경우 다음과 같이 비교할 수 있습니다.

$today = new DateTime('Y-m-d');

$date = $row->expireDate;

if($today < $date) { /* do something */ }

이 답변은 원래 게시 된 질문을 무시합니다. OP에서 제공하는 샘플 데이터를 사용하십시오.
mickmackusa

그 사람이 도움을 요청하는 것이 정확히는 아니지만 원칙을 이해하면 도움이 될 것이라고 생각했습니다.
faye.babacar78

원칙은 이해하지만이 코드는 질문에 대한 답변이 아닙니다. 이 페이지는 이미 부정확하고 관련없는 답변으로 가득 차 있습니다. 이것은 연구원을 혼란스럽게하고 시간을 낭비 할뿐입니다. 연구원을 찾고 있습니다.
mickmackusa

그다지 어렵지 않다고 생각합니다. 그는 date () 함수 대신 DateTime () 클래스를 사용할 수있었습니다. 제가 위에 넣은 대답은 어떻게 든 연구자들에게 아이디어를주는 것입니다.
faye.babacar78

1
나는 내 자신을 반복하는 것을 멈추고이 토론을 중단 할 것입니다. 두 번째로 높은 솔루션 ( stackoverflow.com/a/3847762/2943403 )은 두 개의 datetime 객체를 만드는 매우 간단한 (탁월한) 방법을 보여줍니다. 나는 당신의 마법적인 requestDate()방법이 무엇을하는지 전혀 모른다 . 어디에도 그것에 대한 언급이 없다. 나는 귀하의 답변을 사용하지 않으며 연구원이 귀하의 솔루션을 사용하도록 권장하지 않습니다. 내 투표가 변경 될 것으로 예상하지 않습니다.
mickmackusa

-2

우선, 서버의 현재 날짜 시간에 원하는 형식을 지정하십시오.

  1. 현재 날짜 시간 얻기

    $ current_date = getdate ();

  2. 원하는대로 관리 할 날짜와 시간을 분리하세요.

$ current_date_only = $ current_date [연도] .'- '. $ current_date [mon] .'-'. $ current_date [mday]; $ current_time_only = $ current_date [ 'hours']. ':'. $ current_date [ 'minutes']. ':'. $ current_date [ 'seconds'];

  1. DB에서 donly date 또는 datetime을 사용하는지에 따라 비교하십시오.

    $ today = $ current_date_only. ' '. $ current_time_only;

    또는

    $ today = $ current_date_only;

    if ($ today <$ expireDate)

도움이되기를 바랍니다


이 답변은 원래 질문을 풀려고하지 않습니다. OP는 시간, 분 또는 초에 관심이 없습니다.
mickmackusa
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.