Como posso comparar duas datas no PHP?

125

Como posso comparar duas datas no PHP?

A data é armazenada no banco de dados no seguinte formato

2011-10-2

Se eu quisesse comparar a data de hoje com a data no banco de dados para ver qual é maior, como eu faria isso?

Eu tentei isso,

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

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

mas realmente não funciona dessa maneira. Qual é outra maneira de fazer isso?

Sarmen B.
fonte
Atribua as datas db a um objeto DateTime e compare esses objetos. Você pode encontrar um bom exemplo na stackoverflow.com/questions/961074/...
Peter

Respostas:

80

no banco de dados a data se parece com isso 2011-10-2

Armazene-o em AAAA-MM-DD e a comparação de cadeias funcionará porque '1'> '0' etc.

Mateus
fonte
2
mas e se eles se parecerem com isso, 02/10/2011 e 10/02/2012, para comparação de meses 1> 0, mas 02/10/2011 <10/02/2012
dav
14
@Davo, a comparação é interrompida no primeiro caractere diferente. Nesse caso, o quarto dígito de '1' <'2', para obter o resultado esperado.
23713 Matthew
1
Me desculpe :), não foi cuidadoso o suficiente.
dav
o seguinte trabalho 2016-03-27 11:59:47 ::: 2016-03-14 10:30:00?
shorif2000
221

Se todas as suas datas forem posteriores a 1º de janeiro de 1970, você poderá usar algo como:

$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 */ }

Se você estiver usando PHP 5> = 5.2.0, poderá usar a classe DateTime:

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

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

Ou algo nesse sentido.

Hugo Peixoto
fonte
Se bem me lembro, a preocupação 1st of January of 1970se aplica apenas às versões antigas do PHP em execução no Windows e nunca foi um problema no Unix.
Álvaro González
Eu gosto desta resposta. É uma ótima escolha converter datas em strtotime ()
Erich García
2
Não seria agora "se todas as suas datas forem posteriores a 1º de janeiro de 1970" e "anteriores a 2038"? assista ao nosso bug do y2k38. strtotimeretornará false para datas maiores. stackoverflow.com/questions/2012589/…
blamb
Observe que o DateTimemétodo é o método preferido. Esse objeto pode fazer muito mais do que strtotimenunca.
Machavity
new DateTime('now')também trabalha para recuperar a data de hoje
Breith 27/04
23

Apenas para complementar as respostas já fornecidas, consulte o seguinte exemplo:

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



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

Atualização: Ou use a função date () da velha escola :

if(date('Y-m-d') < date('Y-m-d', strtotime($expire_date))){
    //echo not yet expired! 
}   
d.raev
fonte
1
Data é uma função, não uma classe / construtor.
Spdionis
2
@spdionis obrigado pelo comentário, alterei a letra maiúscula para remover possíveis confusões.
precisa saber é
6

Eu não faria isso com PHP. Um banco de dados deve saber, que dia é hoje. (Use MySQL-> NOW () por exemplo), para que seja muito fácil comparar dentro da Consulta e retornar o resultado, sem problemas, dependendo dos tipos de datas usados

SELECT IF(expireDate < NOW(),TRUE,FALSE) as isExpired FROM tableName
Dr.Molle
fonte
obrigado, mas eu realmente usar date () eu não data de lojas de hoje em um db
Sarmen B.
4
Mas você armazena expireDate em um banco de dados. Compare esta data com NOW ()
Dr.Molle
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.";
}
Atif Mahmood
fonte
2

Aqui está uma maneira de obter a diferença entre duas datas em minutos.

// 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
fonte
A pergunta é para comparar duas datas - sua resposta está adicionando um monte de coisas extras (ou seja, definindo o status online / offline) que não são necessárias como resposta à pergunta. A parte da sua resposta em que a comparação ocorre é praticamente a mesma que a resposta já existente aqui .
crazyloonybin
Atualizei a pergunta, postei a resposta errada na pergunta errada ^^;) Não é a mesma que a resposta, apenas adicionando minha opinião sobre como compará-las e obter a diferença em minutos.
Syno
1
Eu removi meu downvote por causa de sua atualização, parece muito melhor agora :)
crazyloonybin
2

Você pode converter as datas em timestamps UNIX e comparar a diferença entre elas em segundos.

$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";
   }
Shruthi reddy
fonte
0

Eu também tive esse problema e resolvo-o da seguinte maneira:

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

if(($today - $expire) > $NUMBER_OF_DAYS) 
{ 
    //do something; 
}
PiotrK
fonte
Por que essa técnica funciona deve ser explicado na resposta.
mickmackusa 12/06
Responda à pergunta postada pelo OP, não como você resolveu seu próprio cenário único.
mickmackusa 12/06
0

Aqui está minha explicação sobre como obter a diferença de dias entre duas datas com o PHP. Observe o uso de '!' no formato para descartar a parte da hora das datas, graças a informações de DateTime createFromFormat sem hora .

$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
fonte
-1

Encontrei a resposta em um blog e é tão simples quanto:

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

E você terá os dias entre as 2 datas.

kooli
fonte
Isso parece estar resolvendo um problema diferente. Por favor, responda apenas à pergunta feita pelo OP.
mickmackusa 12/06
-1

Isso funciona devido à lógica de comparação de strings do PHP. Simplesmente você pode conferir ...

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

Ambas as datas devem estar no mesmo formato. Os dígitos precisam ser preenchidos com zero à esquerda e ordenados do mais significativo para o menos significativo. Y-m-de Y-m-d H:i:ssatisfazer essas condições.

sanjyot
fonte
1
d-m-Ynão funcionará .. Y-m-d(com zero à esquerda como 08/05/2016) funcionará. Confira essas datas no d-m-Yformato 01-10-2016e 20-02-2016, comparando como strings 0 <2, ele vai parar de comparar, mas incorretamente ...
Arxeiss
Aqui está a prova de que sua técnica falhará ao comparar corretamente as datas do OP com a data de hoje: 3v4l.org/SNHKT
mickmackusa
O OP tem um formato de data diferente. a data parece 2011-10-2.
mickmackusa 12/06
-1

Se você deseja que uma data ($ date) expire em algum intervalo, por exemplo, uma data de validade do token ao executar uma redefinição de senha, veja como você pode:

$date = $row->expireDate;

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

$now = new \DateTime();

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

Mas no seu caso, você pode fazer a comparação da seguinte maneira:

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

$date = $row->expireDate;

if($today < $date) { /* do something */ }
faye.babacar78
fonte
Esta resposta está ignorando a pergunta postada originalmente. Por favor, use os dados de amostra fornecidos pelo OP.
mickmackusa 12/06
Não é exatamente o que o cara está pedindo ajuda, mas achei que dessa maneira poderia ajudar se alguém entendesse os princípios.
faye.babacar78 13/06
Eu entendo os princípios, mas este código não responde à pergunta. Esta página já está cheia de respostas incorretas e não relacionadas - isso apenas confunde os pesquisadores e desperdiça seu tempo. Estou tentando cuidar de pesquisadores.
mickmackusa 13/06
Bem, acho que não é tão difícil, ele poderia ter usado a classe DateTime () em vez da função date (). A resposta que coloquei acima é de alguma forma dar idéias aos pesquisadores.
faye.babacar78 13/06
1
Vou parar de me repetir e me desassociar dessa discussão. A segunda solução mais alta ( stackoverflow.com/a/3847762/2943403 ) mostra uma maneira terrivelmente simples (imbatível) de criar dois objetos de data e hora. Não tenho absolutamente nenhuma idéia do que o seu requestDate()método mágico faz - não há menção a ele em nenhum lugar. Eu não usaria sua resposta, nem recomendo que qualquer pesquisador use sua solução. Não me prevejo mudar meu voto.
mickmackusa 13/06
-2

Antes de tudo, tente fornecer o formato desejado para a data e hora atuais do seu servidor:

  1. Obter data e hora atual

    $ current_date = getdate ();

  2. Data e hora separadas para gerenciá-las como desejar:

$ current_date_only = $ current_date [ano] .'- '. $ current_date [mon] .'-'. $ current_date [mday]; $ current_time_only = $ current_date ['horas']. ':'. $ current_date ['minutos']. ':'. $ current_date ['segundos'];

  1. Compare-o dependendo se você estiver usando data ou hora do donly no seu banco de dados:

    $ today = $ current_date_only. ' '. $ current_time_only;

    ou

    $ today = $ current_date_only;

    if ($ today <$ expireDate)

espero que ajude

Ernestoloredo
fonte
Esta resposta não tenta resolver a pergunta original. O OP não tem interesse em horas, minutos ou segundos.
mickmackusa 12/06