Подтвердить что ты не робот

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!";  
}
4b9b3361

Ответ 1

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

$paymentDate = date('Y-m-d');
$paymentDate=date('Y-m-d', strtotime($paymentDate));
//echo $paymentDate; // echos today! 
$contractDateBegin = date('Y-m-d', strtotime("01/01/2001"));
$contractDateEnd = date('Y-m-d', strtotime("01/01/2012"));

if (($paymentDate > $contractDateBegin) && ($paymentDate < $contractDateEnd)){
    echo "is between";
}else{
    echo "NO GO!";  
}

Ответ 2

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

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

Ответ 3

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

$paymentDate = strtotime(date("Y-m-d 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!";  
}    

Ответ 4

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

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

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

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

Ответ 5

На основе ответа 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!";

Ответ 6

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

$paymentDate = strtotime(date("d-m-Y"));
$contractDateBegin = strtotime("01-01-2001");
$contractDateEnd = strtotime("01-01-2015");

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

Ответ 7

Другим решением было бы рассмотреть дату, написанную как 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).

Ответ 8

Если вам нужны скобочные даты, чтобы быть динамическими

$todayStr = date('Y-m-d');
$todayObj=date('Y-m-d', strtotime($todayStr));
$currentYrStr =  date('Y');
$DateBegin = date('Y-m-d', strtotime("06/01/$currentYrStr"));
$DateEnd = date('Y-m-d', strtotime("10/01/$currentYrStr"));
if (($todayObj > $contractDateBegin) && ($paymentDate < $contractDateEnd)){
    $period="summer";
}else{
   $period="winter";  
}

Ответ 9

Другое решение (при условии, что вы знаете, что ваши форматы даты всегда ГГГГ/ММ/ДД с ведущими нулями) - это функции max() и min(). Я полагаю, что все в порядке, учитывая, что все остальные ответы также предполагают формат гггг-мм-дд и это общее соглашение об именах для папок в файловых системах, если вы когда-нибудь хотели убедиться, что они отсортированы в порядке дат.

Как уже говорили другие, учитывая порядок чисел, вы можете сравнивать строки, нет необходимости в функции strtotime().

Примеры:

$biggest = max("2018/10/01","2018/10/02");

Преимущество в том, что вы можете вставить больше дат вместо того, чтобы просто сравнивать две.

$biggest = max("2018/04/10","2019/12/02","2016/03/20");

Чтобы определить, находится ли дата между двумя датами, вы можете сравнить результат min() и max()

$startDate="2018/04/10";
$endDate="2018/07/24";
$check="2018/05/03";
if(max($startDate,$check)==min($endDate,$check)){
    // It in the middle
}

Это не будет работать с любым другим форматом даты, но для этого он делает. Нет необходимости конвертировать в секунды и нет необходимости в функциях даты.