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!";
}
Ответы
Ответ 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
}
Это не будет работать с любым другим форматом даты, но для этого он делает. Нет необходимости конвертировать в секунды и нет необходимости в функциях даты.