Как я могу сравнить две даты в PHP?

125

Как я могу сравнить две даты в PHP?

Дата хранится в базе данных в следующем формате

2011-10-2

Если бы я хотел сравнить сегодняшнюю дату с датой в базе данных, чтобы увидеть, какая из них больше, как бы я это сделал?

Я пробовал это,

$today = date("Y-m-d");
$expire = $row->expireDate //from db

if($today < $expireDate) { //do something; }

но на самом деле это не так. Как еще это сделать?

Сармен Б.
источник
Назначьте даты базы данных объекту DateTime, а затем сравните эти объекты. Вы можете найти хороший пример в stackoverflow.com/questions/961074/…
Питер

Ответы:

80

в базе данных дата выглядит так: 2011-10-2

Сохраните его в формате ГГГГ-ММ-ДД, и тогда сравнение строк будет работать, потому что '1'> '0' и т. Д.

Мэтью
источник
2
но что, если они выглядят так, 2011-10-02 и 2012-02-10, для сравнения месяца 1> 0, но 2011-10-02 <2012-02-10
dav
14
@Davo, сравнение останавливается на первом отличном символе. В данном случае четвертая цифра «1» <«2», поэтому вы получите ожидаемый результат.
Мэтью
1
Извините :), не был достаточно осторожен.
dav
будет работать следующее 2016-03-27 11:59:47 ::: 2016-03-14 10:30:00?
Shorif2000,
221

Если все ваши даты предшествуют 1 января 1970 года, вы можете использовать что-то вроде:

$today = date("Y-m-d");
$expire = $row->expireDate; //from database

$today_time = strtotime($today);
$expire_time = strtotime($expire);

if ($expire_time < $today_time) { /* do Something */ }

Если вы используете PHP 5> = 5.2.0, вы можете использовать класс DateTime:

$today_dt = new DateTime($today);
$expire_dt = new DateTime($expire);

if ($expire_dt < $today_dt) { /* Do something */ }

Или что-то в этом роде.

Уго Пейшото
источник
Если я правильно помню, беспокойство по этому поводу 1st of January of 1970относится только к старым версиям PHP, работающим в Windows, и никогда не было проблемой в Unix.
Álvaro González
Мне нравится этот ответ. Отличный выбор для преобразования дат в strtotime ()
Эрих Гарсия
2
Разве сейчас не было бы «Если бы все ваши даты были после 1 января 1970 года» и «до 2038 года»? следите за ошибкой y2k38. strtotimeвернет false для больших дат. stackoverflow.com/questions/2012589/…
blamb
Обратите внимание, что этот DateTimeметод является предпочтительным. Этот объект может сделать гораздо больше, чем strtotimeкогда-либо.
Machavity
new DateTime('now')также работает, чтобы получить сегодняшнюю дату
Брейт
23

Чтобы дополнить уже полученные ответы, см. Следующий пример:

$today = new DateTime('');
$expireDate = new DateTime($row->expireDate); //from database



if($today->format("Y-m-d") < $expireDate->format("Y-m-d")) { 
    //do something; 
}

Обновление: Или просто используйте функцию старой школы date () :

if(date('Y-m-d') < date('Y-m-d', strtotime($expire_date))){
    //echo not yet expired! 
}   
d.raev
источник
1
Дата - это функция, а не класс / конструктор.
spdionis
2
@spdionis спасибо за комментарий, я изменил заглавную букву, чтобы устранить возможную путаницу.
d.raev
6

Я бы не стал этого делать с PHP. База данных должна знать, какой сегодня день (например, используйте MySQL-> NOW ()), поэтому будет очень легко сравнить в запросе и вернуть результат без каких-либо проблем в зависимости от используемых типов дат.

SELECT IF(expireDate < NOW(),TRUE,FALSE) as isExpired FROM tableName
Dr.Molle
источник
спасибо, но на самом деле я использую date (), я не храню сегодняшнюю дату в базе данных
Сармен Б.
4
Но вы храните expireDate в базе данных. Сравните эту дату с СЕЙЧАС ()
Доктор Молл
4
$today = date('Y-m-d');//Y-m-d H:i:s
$expireDate = new DateTime($row->expireDate);// From db 
$date1=date_create($today);
$date2=date_create($expireDate->format('Y-m-d'));
$diff=date_diff($date1,$date2);

//echo $timeDiff;
if($diff->days >= 30){
    echo "Expired.";
}else{
    echo "Not expired.";
}
Атиф Махмуд
источник
2

Вот способ, как получить разницу между двумя датами за считанные минуты.

// set dates
$date_compare1= date("d-m-Y h:i:s a", strtotime($date1));
// date now
$date_compare2= date("d-m-Y h:i:s a", strtotime($date2));

// calculate the difference
$difference = strtotime($date_compare1) - strtotime($date_compare2);
$difference_in_minutes = $difference / 60;

echo $difference_in_minutes;
Syno
источник
Вопрос заключается в сравнении двух дат - ваш ответ - это добавление дополнительных вещей (например, установка статуса онлайн / офлайн), которые не нужны в качестве ответа на вопрос. Часть вашего ответа, в которой происходит сравнение, практически такая же, как и уже существующий здесь ответ .
crazyloonybin 06
Обновил вопрос, я отправил неправильный ответ в неправильный вопрос ^^;) Это не то же самое, что ответ, просто добавляю свой вклад о том, как их сравнить и получить разницу в минутах.
Syno
1
Я снял свой отрицательный голос из-за вашего обновления, теперь выглядит намного лучше :)
crazyloonybin
2

Вы можете преобразовать даты в отметки времени UNIX и сравнить разницу между ними в секундах.

$today_date=date("Y-m-d");
$entered_date=$_POST['date'];
$dateTimestamp1 = strtotime($today_date);
$dateTimestamp2 = strtotime($entered_date);
$diff= $dateTimestamp1-$dateTimestamp2;
//echo $diff;
if ($diff<=0)
   {
     echo "Enter a valid date";
   }
Шрути Редди
источник
0

У меня тоже была эта проблема, и я решаю ее:

$today = date("Ymd");
$expire = str_replace('-', '', $row->expireDate); //from db

if(($today - $expire) > $NUMBER_OF_DAYS) 
{ 
    //do something; 
}
PiotrK
источник
В ответе нужно объяснить, почему эта техника работает.
mickmackusa
Пожалуйста, ответьте на опубликованный вопрос OP, а не как вы решили свой собственный уникальный сценарий.
mickmackusa,
0

Вот мой рассказ о том, как с помощью PHP получить разницу в днях между двумя датами. Обратите внимание на использование символа '!' в формате, чтобы отбросить временную часть дат, благодаря информации из DateTime createFromFormat без времени .

$today = DateTime::createFromFormat('!Y-m-d', date('Y-m-d'));
$wanted = DateTime::createFromFormat('!d-m-Y', $row["WANTED_DELIVERY_DATE"]);
$diff = $today->diff($wanted);
$days = $diff->days;
if (($diff->invert) != 0) $days = -1 * $days;
$overdue = (($days < 0) ? true : false);
print "<!-- (".(($days > 0) ? '+' : '').($days).") -->\n";
nwsmith
источник
-1

Нашел ответ в блоге, и это очень просто:

strtotime(date("Y"."-01-01")) -strtotime($newdate))/86400

И вы получите дни между двумя датами.

Kooli
источник
Похоже, это решает другую проблему. Пожалуйста, ответьте только на вопрос, заданный OP.
mickmackusa,
-1

Это работает из-за логики сравнения строк PHP. Просто можете проверить ...

if ($startdate < $date) {// do something} 
if ($startdate > $date) {// do something}

Обе даты должны быть в одном формате. Цифры необходимо дополнить нулями слева и отсортировать от наиболее значимого к наименее значимому. Y-m-dи Y-m-d H:i:sудовлетворяют этим условиям.

sanjyot
источник
1
d-m-Yне будет работать .. Y-m-d(с нулем в начале, например, 08.05.2016) будет работать. Проверьте эти даты в d-m-Yформате 01-10-2016и 20-02-2016, сравнив их как строки 0 <2, сравнение прекратится, но будет некорректно ...
Arxeiss
Вот доказательство того, что ваша техника не сможет правильно сравнить даты ОП с сегодняшней датой: 3v4l.org/SNHKT
mickmackusa
OP имеет другой формат даты. дата похожа 2011-10-2.
mickmackusa,
-1

Если вы хотите, чтобы дата ($ date) истекла через некоторый интервал, например, дату истечения срока действия токена при выполнении сброса пароля, вот как вы можете сделать:

$date = $row->expireDate;

$date->add(new DateInterval('PT24H')); // adds 24 hours

$now = new \DateTime();

if($now < $date) { /* expired after 24 hours */ }

Но в вашем случае вы можете провести сравнение следующим образом:

$today = new DateTime('Y-m-d');

$date = $row->expireDate;

if($today < $date) { /* do something */ }
faye.babacar78
источник
Этот ответ игнорирует первоначально заданный вопрос. Используйте образцы данных, предоставленные OP.
mickmackusa,
Это не совсем то, о чем парень просит о помощи, но я подумал, что этот способ может помочь, если кто-то поймет принципы.
faye.babacar78,
Я понимаю принципы, но этот код не отвечает на заданный вопрос. Эта страница уже завалена неправильными и несвязанными ответами - это только сбивает исследователей с толку и тратит их время. Я пытаюсь найти исследователей.
mickmackusa
Думаю, это не так уж и сложно, он мог бы использовать класс DateTime () вместо функции date (). Ответ, который я дал выше, заключается в том, чтобы каким-то образом дать идеи исследователям.
faye.babacar78,
1
Я перестану повторяться и выйду из этой дискуссии. Второе по величине решение ( stackoverflow.com/a/3847762/2943403 ) показывает ужасно простой (непревзойденный) способ создания двух объектов datetime. Я понятия не имею, что делает ваш магический requestDate()метод - о нем нигде не упоминается. Я бы не стал использовать ваш ответ и не рекомендовал бы исследователям использовать ваше решение. Я не предвижу, что изменю свой голос.
mickmackusa,
-2

Прежде всего, попробуйте задать формат текущей даты вашего сервера:

  1. Получить текущую дату и время

    $ current_date = getdate ();

  2. Разделяйте дату и время, чтобы управлять ими по своему усмотрению:

$ current_date_only = $ current_date [год].'- '. $ current_date [mon] .'-'. $ current_date [день]; $ current_time_only = $ current_date ['часы']. ':'. $ current_date ['минуты']. ':'. $ current_date ['секунды'];

  1. Сравните это в зависимости от того, используете ли вы дату или дату и время в своей БД:

    $ сегодня = $ current_date_only. ' »$ Current_time_only.

    или

    $ сегодня = $ current_date_only;

    если ($ сегодня <$ expireDate)

Надеюсь, поможет

ernestoloredo
источник
Этот ответ не пытается решить исходный вопрос. OP не интересуется часами, минутами или секундами.
mickmackusa,