2015-05-09 2 views
0

У меня есть простой DateTime урок. Я сравниваю 2 объекта DateTime, и они не работают правильно. Я попытался поменять местами, и все еще не удается. Он не работает, когда я ввожу текущую дату вручную, даже если дата такая же. Я должен ввести дату вручную, хотя. Спасибо за любую помощь. Heres функция:php DateTime сравнение объектов

function dtcompare(){ 
    //I make the date the same as the current 
    //date and it doesnt echo that its equal. 
    $date1 = new DateTime('5/9/2015'); //a date entered 
    $date2 = new DateTime(); //the current date 
    $mdy = 'n/j/Y'; //the format 

    if($date1 == $date2){ 

     echo "d1 == d2"; //This should be echoing 
    } 
    elseif($date1 > $date2){ 

     echo "d1 > d2"; 
    } 
    elseif($date1 < $date2){   

     echo " d1 < d2 "; //but this always echos 
    } 
    } 

Я изменил все, чтобы сделать сравнения формата, но сейчас самые низкие даты вторят даже когда я кладу в будущем. Вот что происходит:

function dtcompare(){ 
 
    
 
     
 
    $date1 = new DateTime('5/18/2015'); //a future date 
 
    $date2 = new DateTime(); //the current date 
 
    $mdy = 'n/j/Y'; //the format 
 
    
 
    if($date1->format($mdy) == $date2->format($mdy)){ 
 
    
 
     echo "d1 == d2"; 
 
    } 
 
    elseif($date1->format($mdy) > $date2->format($mdy)){ 
 
     //This will echo if the date is in the next month 6/1/2015  
 
     echo "d1 > d2"; 
 
    } 
 
    elseif($date1->format($mdy) < $date2->format($mdy)){   
 
    
 
     //This echos even though it's not 5/18/2015 yet!   
 
     echo $date1->format($mdy)."d1 < d2".$date2->format($mdy); 
 
    } 
 
    }

Я играл с этим, и я получил его на работу, используя некоторые из обоих. Я думаю, что это не значит, что он должен работать и может вызвать проблемы с какой-то другой датой, о которой я не знаю. Вот что я сделал:

function dtcompare(){ 
 
    
 
    $date1 = new DateTime('5/12/2015'); //a future date 
 
    $date2 = new DateTime(); //the current date 
 
    $mdy = 'n/j/Y'; //the format 
 
    
 
    
 
    //Using the datetime->format for == comparisons and the other 
 
    //way for datetimes greater or less than. This works, but I think this is NOT 
 
    //how this should work though. It feels like a rig for something that 
 
    //should work one way (DateTime->format() comparison) or another (DateTime comparison w.o format) 
 
    if($date1->format($mdy) == $date2->format($mdy)){ 
 
     echo 'date1 and date2 have the same date and time'; 
 
    } 
 
    elseif($date1 > $date2){ 
 
     echo 'date1 > date2 meaning its a later date and time'; 
 
    } 
 
    elseif($date1 < $date2){ 
 
     echo 'date1 < date2 meaning its an earlier date and time'; 
 
    } 
 
}

ответ

3

Ну вы определили свой формат, в котором вы хотите, чтобы сравнить два DateTime «с, но вы не использовали его.

Просто используйте format() с переменной вашего формата, когда вы сравниваете два DateTimes иначе и secons и minutes, только все сравнивается.

if($date1->format($mdy) == $date2->format($mdy)){ 
     //^^^^^^^^^^^^^^ See here, to just compare month, day and year 
    echo "d1 == d2"; //This should be echoing 
} 
elseif($date1->format($mdy) > $date2->format($mdy)){ 

    echo "d1 > d2"; 
} 
elseif($date1->format($mdy) < $date2->format($mdy)){   

    echo " d1 < d2 "; //but this always echos 
} 

EDIT:

Это должно работать для вас, вы должны сначала отформатировать дату, а затем взять временную метку, например:

$mdy = 'n/j/Y'; //the format 
$date1 = strtotime((new DateTime('5/18/2015'))->format($mdy)); 
$date2 = strtotime((new DateTime())->format($mdy)); 


if($date1 == $date2){ 
    echo "d1 == d2"; 
} elseif($date1 > $date2) { 
    echo "d1 > d2"; 
} elseif($date1 < $date2){   
    echo $date1."d1 < d2".$date2; 
} 
+0

Спасибо за ответ. Я обновил то, что вы предлагаете, но объект DateTime говорит, что более высокая дата (5/18/2015) ниже сегодняшней даты (5/9/2015). Это же сравнение работает, если я сравню w.o с использованием $ date-> format(). Должно ли это работать в любом случае? – Zapp

+0

@Zapp Да просто отформатируйте его как хотите даты, а затем вы можете сравнить их – Rizier123

+0

@ Zapp обновил мой ответ сейчас. Прежде чем порядок вашего формата изменился, потому что он сравнил строку, так что теперь просто возьмите метку времени, и все должно хорошо работать – Rizier123

1

Использовать форматирование даты первого и затем сравните, так как вы не можете сравнить 2 объекта с датой Непосредственно

Использование:

<?php 

    //I make the date the same as the current 
    //date and it doesnt echo that its equal. 
    $date1 = new DateTime('5/9/2015'); //a date entered 
    $date2 = new DateTime(); //the current date 
    $mdy = 'n/j/Y'; //the format 

$date1New = $date1->format('d-m-y'); 
$date2New = $date2->format('d-m-y'); 

////echo '<br> --2'.$date2; 

    if($date1New == $date2New){ 

     echo "d1 == d2"; //This should be echoing 
    } 
    elseif($date1New > $date2New){ 

     echo "d1 > d2"; 
    } 
    elseif($date1New < $date2New){   

     echo " d1 < d2 "; //but this always echos 
    } 

    ?> 
+0

Это же сравнение работает, если я сравниваю w.o с использованием $ date-> format().Но это вызывает мою оригинальную проблему с сопоставлением ==. Должно ли это работать в любом случае? – Zapp

0

php DateTime уже имеет возможность выводить unixtimestamp. Поэтому вы можете просто сравнить вот так:

$early = new DateTime("now"); 
$later = new DateTime("now + 2days"); 

if ($early->format('U') < $later->format('U')) { 
    echo "you'll get this printed"; 
} 
+0

Спасибо. Я не использовал параметр «U». Работает ли это с остальными сравнениями? – Zapp

Смежные вопросы