PHP проверяет, существует ли дата между двумя датами

Я получил этот код из Stackoverflow и немного изменил его, чтобы работать с сегодняшней датой.

Я хочу проверить, подходит ли сегодня между двумя датами. Но это не работает. Что мне не хватает?

$paymentDate = date('d/m/Y'); echo $paymentDate; // echos today! $contractDateBegin = date('d/m/Y', '01/01/2001'); $contractDateEnd = date('d/m/Y', '01/01/2015'); if ($paymentDate > $contractDateBegin && $paymentDate < $contractDateEnd) { echo "is between"; } else { echo "NO GO!"; } 

Это правильный ответ для вашего кода. Просто используйте функцию strtotime () php

  $paymentDate = date('Ym-d'); $paymentDate=date('Ym-d', strtotime($paymentDate));; //echo $paymentDate; // echos today! $contractDateBegin = date('Ym-d', strtotime("01/01/2001")); $contractDateEnd = date('Ym-d', strtotime("01/01/2012")); if (($paymentDate > $contractDateBegin) && ($paymentDate < $contractDateEnd)) { echo "is between"; } else { echo "NO GO!"; } 

Вы не можете сравнивать строки даты. Хорошая привычка вместо этого использовать объект DateTime PHP:

 $paymentDate = new DateTime(); // Today echo $paymentDate->format('d/m/Y'); // echos today! $contractDateBegin = new DateTime('2001-01-01'); $contractDateEnd = new DateTime('2015-01-01'); if ( $paymentDate->getTimestamp() > $contractDateBegin->getTimestamp() && $paymentDate->getTimestamp() < $contractDateEnd->getTimestamp()){ echo "is between"; }else{ echo "NO GO!"; } 

Если значение часов:

 $paymentDate = strtotime(date("Ymd H:i:s")); $contractDateBegin = strtotime("2014-01-22 12:42:00"); $contractDateEnd = strtotime("2014-01-22 12:50:00"); if($paymentDate > $contractDateBegin && $paymentDate < $contractDateEnd) { echo "is between"; } else { echo "NO GO!"; } 

Вы сравниваете даты как строки, которые не будут работать, потому что сравнение лексикографическое. Это та же проблема, что и при сортировке текстового файла, где строка строки 20 появляется после строки 100 потому что содержимое не обрабатывается как числа, а как последовательности кодов ASCII. Кроме того, создаваемые даты неверны, потому что вы используете строковый формат, где ожидается отметка времени (второй аргумент).

Вместо этого вы должны сравнивать временные метки объектов DateTime , например:

  $paymentDate = date_create(); $contractDateBegin = date_create_from_format('01/01/2001', 'd/m/Y'); $contractDateEnd = date_create_from_format('01/01/2015', 'd/m/Y'); 

Тогда ваши существующие условия будут работать правильно.

Использовать напрямую

 $paymentDate = strtotime(date("dmY")); $contractDateBegin = strtotime("01-01-2001"); $contractDateEnd = strtotime("01-01-2015"); 

Тогда сравнение будет хорошо, потому что ваш 01-01-2015 действителен для 32-битного диапазона дат PHP, указанного в руководстве strtotime.

На основании ответа luttken. Думаю, я бы добавил свой поворот 🙂

 function dateIsInBetween(\DateTime $from, \DateTime $to, \DateTime $subject) { return $subject->getTimestamp() > $from->getTimestamp() && $subject->getTimestamp() < $to->getTimestamp() ? true : false; } $paymentDate = new \DateTime('now'); $contractDateBegin = new \DateTime('01/01/2001'); $contractDateEnd = new \DateTime('01/01/2016'); echo dateIsInBetween($contractDateBegin, $contractDateEnd, $paymentDate) ? "is between" : "NO GO!"; 

Другим решением было бы рассмотреть дату, написанную как Ymd.

Написанный в этом «формате», это очень легко сравнить даты.

 $paymentDate = date('Ymd'); // on 4th may 2016, would have been 20160504 $contractBegin = 20010101; $contractEnd = 20160101; echo ($paymentDate >= $contractBegin && $paymentDate <= $contractEnd) ? "Between" : "Not Between"; 

Он всегда будет работать каждый день в году и не зависит от какой-либо функции или преобразования (PHP будет учитывать значение int $paymentDate для сравнения с стоимостью int contractBegin и contractEnd ).