Почему PHP не распознает, когда указанная дата после сегодняшней даты?

#php #mysql #unix #date #compare

#php #mysql #unix #Дата #Сравнить

Вопрос:

Я хочу сравнить две даты в PHP. Одна дата — это дата, которая предоставляется пользователем, сохраняется в базе данных и извлекается с помощью PHP. Вторая — сегодняшняя дата.

     $unixdue = strtotime($query['date_due']); //Converts the database integer to Unix date
    $duestamp = date("dmY", $unixdue); //Converts the Unix date to dd-mm-yyyy


//If the due date is larger than today (i.e., after today), it's early.
        if ($query['complete'] == 0 AND date("dmY") < $duestamp) {echo "Early";}
//If the due date is smaller than today (i.e., before today), it's late.
        elseif ($query['complete'] == 0 AND date("dmY") > $duestamp) {echo "Late";}
//If the due date IS today, it's today.
        elseif ($query['complete'] == 0 AND date("dmY") == $duestamp) {echo "Today";}
  

Он работает с сегодняшними датами, но все остальные возвращаются «Рано», даже если они не являются ранними.
Из-за этого я даже не могу сказать, работает ли rest вообще.

Я попытался сравнить две даты Unix, но они также включают время, когда на самом деле мне нужна только дата. Если я сравниваю две даты unix, я не могу сказать, является ли что-то «сегодняшним».

Комментарии:

1. Не могли бы вы показать некоторые фактические данные, пожалуйста? Что date_due содержит и в какую временную метку оно включено?

2. Вы сравниваете не даты, вы сравниваете строки.

3. это не PHP, это ваш код.

Ответ №1:

Вы не можете сравнить, являются ли две строки меньше или больше друг друга. Или вы можете, но в этом случае вы не должны, потому что результаты не те, которые вы хотите («03092011» < «29082011», например).

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

 if( $query['complete'] == 0 ) {
    if( date("dmY") == $duestamp ) { echo "Today"; }
    elseif( time() < $unixdue ) { echo "Early"; }
    elseif( time() > $unixdue ) { echo "Late"; }
}
  

Ответ №2:

Вы неправильно сравниваете.

Возможным решением было бы использовать date('Ymd') , но еще лучше использовать временные метки как time() и $unixdue

Ответ №3:

Используйте time функцию:

 $msg = "Late";

if( $unixdue > time() ){
$msg = "Early";
}

if(date("dmY") === $duestamp){
$msg = "Today";
}
  

Вот где это задокументировано.

Ответ №4:

вы слишком усложнили свой код, введя временную метку unix, что абсолютно излишне
, и, похоже, вам нужно перенести проверку полноты в SQL-запрос. Итак

 if     ($query['date_due'] > date("Y-m-d")) echo "Early";
elseif ($query['date_due'] < date("Y-m-d")) echo "Late";
else echo "Today";
  

и я полагаю, что вы также можете перенести это условие в запрос