Comparar data determinada com hoje

216

Eu tenho seguindo

$var = "2010-01-21 00:00:00.0"

Gostaria de comparar esta data com a data de hoje (ou seja, gostaria de saber se isso $varé antes de hoje ou é igual a hoje ou não)

Que função eu precisaria usar?

alexus
fonte
5
Eu sugeriria definir o fuso horário também
NJInamdar

Respostas:

289
strtotime($var);

Transforma em um valor de tempo

time() - strtotime($var);

Dá-lhe os segundos desde $var

if((time()-(60*60*24)) < strtotime($var))

Irá verificar se $varesteve no último dia.

Tyler Carter
fonte
1
para o php 4 saia do último '.0' de $ var = "2010-01-21 00: 00: 00.0", caso contrário, o strtotime retornará -1
vivoconunxino
1
Estou usando o PHP 7.1. A parte do subsegundo é apenas ignorada, dado que o retorno é um número inteiro com o número de segundos.
Diogo Melo
208

Esse formato é perfeitamente apropriado para uma comparação de strings padrão, por exemplo

if ($date1 > $date2){
  //Action
}

Para obter a data de hoje nesse formato, basta usar: date("Y-m-d H:i:s") .

Assim:

$today = date("Y-m-d H:i:s");
$date = "2010-01-21 00:00:00";

if ($date < $today) {}

Essa é a beleza desse formato: ele ordena muito bem. Claro que pode ser menos eficiente, dependendo das circunstâncias exatas, mas também pode ser muito mais conveniente e levar a um código mais sustentável - precisamos saber mais para realmente fazer essa decisão.

Para o fuso horário correto, você pode usar, por exemplo,

date_default_timezone_set('America/New_York');

Clique aqui para consultar os fusos horários do PHP disponíveis.

Bobby Jack
fonte
2
Isso também ignora o fuso horário
anushr
@anushr, se o fuso horário for necessário em comparação, a diferença de fuso horário poderá ser adicionada até a data antes da comparação. Isso ainda é mais rápido do que tentar converter duas cadeias mm/dd/yyyyde data e hora em formato para data e compará-las. Sempre me preocupa quando os desenvolvedores têm datas em vários fusos horários no sistema. Eu acho que é melhor armazenar datas no seu sistema, sempre em um fuso horário único e depois exibi-lo no fuso horário necessário. Comecei a usar o yyyy-mm-ddformato (ou yyyymmdd) por volta de 1998, quando percebi que era muito mais rápido, mesmo no SQL Server.
AaA 29/01
59

Aqui está:

function isToday($time) // midnight second
{
    return (strtotime($time) === strtotime('today'));
}

isToday('2010-01-22 00:00:00.0'); // true

Além disso, mais algumas funções auxiliares:

function isPast($time)
{
    return (strtotime($time) < time());
}

function isFuture($time)
{
    return (strtotime($time) > time());
}
Alix Axel
fonte
Por que a estranha lógica inversa e booleanos estranhos? Por que não apenas "return strtotime ($ time) == strtotime ('today')", "return strtotime ($ time)> time ()" e "return strtotime ($ time) <time ()"?
Bobby Jack
@ Jack Bobby: Eu tinha mais funcionalidade nessas funções, esqueci de excluir o código extra. Corrigido agora.
Alix Axel
+1 na função auxiliar, especificamente isPast b / c Acabei de executar a if(strtotime('2013-01-22 00:00:00.00') < time()){....}e isso foi feito por mim.
precisa saber é o seguinte
47

Para concluir o BoBby Jack, o uso do DateTime OBject, se você tiver o php 5.2.2+:

if(new DateTime() > new DateTime($var)){
    // $var is before today so use it

}
kamakazuu
fonte
Isso não está correto. Se $ var for o dia atual (após a meia-noite exata), o novo DateTime () será maior que o novo DateTime ($ var) e não é verdade que $ var será anterior a hoje.
dxvargas 15/01
46

Você pode usar a DateTimeclasse:

$past   = new DateTime("2010-01-01 00:00:00");
$now    = new DateTime();
$future = new DateTime("2021-01-01 00:00:00");

Operadores de comparação trabalham *:

var_dump($past   < $now);         // bool(true)
var_dump($future < $now);         // bool(false)

var_dump($now == $past);          // bool(false)
var_dump($now == new DateTime()); // bool(true)
var_dump($now == $future);        // bool(false)

var_dump($past   > $now);         // bool(false)
var_dump($future > $now);         // bool(true)

Também é possível pegar os valores de data e hora dos objetos DateTime e compará-los:

var_dump($past  ->getTimestamp());                        // int(1262286000)
var_dump($now   ->getTimestamp());                        // int(1431686228)
var_dump($future->getTimestamp());                        // int(1577818800)
var_dump($past  ->getTimestamp() < $now->getTimestamp()); // bool(true)
var_dump($future->getTimestamp() > $now->getTimestamp()); // bool(true)

* Observe que ===retorna false ao comparar dois objetos DateTime diferentes, mesmo quando eles representam a mesma data.

Salman A
fonte
$futuretornou-se o passado. : P
mbomb007 5/03
Meu, como o tempo voa.
Salman A
13
$toBeComparedDate = '2014-08-12';
$today = (new DateTime())->format('Y-m-d'); //use format whatever you are using
$expiry = (new DateTime($toBeComparedDate))->format('Y-m-d');

var_dump(strtotime($today) > strtotime($expiry)); //false or true
Hassan
fonte
Isso não é o que os meus $variguais também em OP
alexus
1
E você precisa do PHP> = 5.4 para (novo DateTime ()) -> formato ('Ym-d');
Webrama.pl 18/03/2019
6

Um cuidado com base na minha experiência, se o seu objetivo envolver apenas data, tenha cuidado para incluir o carimbo de data / hora . Por exemplo, digamos que hoje é "2016-11-09". A comparação envolvendo o registro de data e hora anulará a lógica aqui. Exemplo,

//  input
$var = "2016-11-09 00:00:00.0";

//  check if date is today or in the future
if ( time() <= strtotime($var) ) 
{
    //  This seems right, but if it's ONLY date you are after
    //  then the code might treat $var as past depending on
    //  the time.
}

O código acima parece correto, mas se for SOMENTE a data que você deseja comparar, o código acima não é a lógica correta. Por quê? Porque time () e strtotime () fornecerão o registro de data e hora. Ou seja, mesmo que as duas datas caiam no mesmo dia, mas a diferença de tempo será importante. Considere o exemplo abaixo:

//  plain date string
$input = "2016-11-09";

Como a entrada é uma sequência de datas simples, usar strtotime()on $inputassumirá que é a meia-noite de 09/11/2016. Então, correr a time()qualquer hora depois da meia-noite sempre tratará$input como passado, mesmo que eles estejam no mesmo dia.

Para corrigir isso, você pode simplesmente codificar, assim:

if (date("Y-m-d") <= $input)
{
    echo "Input date is equal to or greater than today.";
}
Lynnell Emmanuel Neri
fonte
1
Tenho certeza que o OP considerou isso e é por isso que eles incluíram `00: 00: 00.0 'em sua pergunta
AaA
6

Poucos anos depois, eu segundo a observação de Bobby Jack de que as últimas 24 horas não são hoje !!! E estou surpreso que a resposta tenha sido tão votada ...

Para comparar se uma determinada data é menor, igual ou maior que outra, primeiro você precisa diminuí-las para o início do dia. Em outras palavras, verifique se você está falando da mesma hora 00:00:00 nas duas datas. Isso pode ser feito de forma simples e elegante como:

strtotime("today") <=> strtotime($var)

se $vartiver o horário em 00:00:00 como o OP especificado.

Substituir <=> pelo que você precisar (ou mantenha-o assim no php 7)

Além disso, obviamente, estamos falando do mesmo fuso horário para ambos. Para obter uma lista dos fusos horários suportados

Nelu Bidonelu
fonte
5
$date1=date_create("2014-07-02");
$date2=date_create("2013-12-12");
$diff=date_diff($date1,$date2);

(o exemplo do w3schools funciona perfeitamente)

Richard de Ree
fonte
4

Expandindo a resposta de Josua das w3schools:

//create objects for the dates to compare
$date1=date_create($someDate);
$date2=date_create(date("Y-m-d"));
$diff=date_diff($date1,$date2);
//now convert the $diff object to type integer
$intDiff = $diff->format("%R%a");
$intDiff = intval($intDiff);
//now compare the two dates
if ($intDiff > 0)  {echo '$date1 is in the past';}
else {echo 'date1 is today or in the future';}

Eu espero que isso ajude. Meu primeiro post no stackoverflow!

encélado
fonte
1

Compare objetos de data e hora:

(Escolhi 10 dias - qualquer coisa com mais de 10 dias é "ANTIGO", ou "NOVO")

$now   = new DateTime();
$diff=date_diff($yourdate,$now);
$diff_days = $diff->format("%a");
if($diff_days > 10){
    echo "OLD! " . $yourdate->format('m/d/Y');
}else{
    echo "NEW! " . $yourdate->format('m/d/Y');
}
Kevin
fonte
1

Algumas respostas dadas não têm em consideração o dia atual!

Aqui está a minha proposta.

$var = "2010-01-21 00:00:00.0"
$given_date = new \DateTime($var);

if ($given_date == new \DateTime('today')) {
  //today
}

if ($given_date < new \DateTime('today')) {
  //past
}

if ($given_date > new \DateTime('today')) {
  //future
}
dxvargas
fonte
0

Se você faz coisas com hora e data Carbono é seu melhor amigo;

Instale o pacote então:

$theDay = Carbon::make("2010-01-21 00:00:00.0");

$theDay->isToday();
$theDay->isPast();
$theDay->isFuture();
if($theDay->lt(Carbon::today()) || $theDay->gt(Carbon::today()))

lt = menor que, gt = maior que

Como na pergunta:

$theDay->gt(Carbon::today()) ? true : false;

e muito mais;

Lucas M. Oliveira
fonte