¿Cómo puedo comparar dos fechas en PHP?

125

¿Cómo puedo comparar dos fechas en PHP?

La fecha se almacena en la base de datos en el siguiente formato

2011-10-2

Si quisiera comparar la fecha de hoy con la fecha en la base de datos para ver cuál es mayor, ¿cómo lo haría?

Intenté esto

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

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

pero realmente no funciona de esa manera. ¿Cuál es otra forma de hacerlo?

Sarmen B.
fuente
Asigne las fechas db a un objeto DateTime y luego compare esos objetos. Puede encontrar un buen ejemplo en stackoverflow.com/questions/961074/…
Peter

Respuestas:

80

en la base de datos la fecha se ve así 2011-10-2

Almacénelo en AAAA-MM-DD y luego la comparación de cadenas funcionará porque '1'> '0', etc.

Mateo
fuente
2
pero qué pasa si se ven así, 2011-10-02 y 2012-02-10, para la comparación de meses 1> 0, pero 2011-10-02 <2012-02-10
dav
14
@Davo, la comparación se detiene en el primer personaje que es diferente. En este caso, el cuarto dígito de '1' <'2', para que obtenga el resultado que espera.
Mateo
1
Lo siento :), no fue lo suficientemente cuidadoso.
dav
funcionará el siguiente 2016-03-27 11:59:47 ::: 2016-03-14 10:30:00?
shorif2000
221

Si todas sus fechas son posteriores al 1 de enero de 1970, podría 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 */ }

Si está usando PHP 5> = 5.2.0, podría usar la clase DateTime:

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

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

O algo por el estilo.

Hugo Peixoto
fuente
Si recuerdo correctamente, la preocupación 1st of January of 1970solo se aplica a las versiones antiguas de PHP que se ejecutan en Windows y nunca fue un problema en Unix.
Álvaro González
Me gusta esta respuesta Es una gran opción convertir fechas en tiempo de ejecución ()
Erich García
2
¿No sería ahora "si todas sus fechas son posteriores al 1 de enero de 1970" y "anteriores a 2038"? Mire nuestro para el error y2k38. strtotimedevolverá falso para fechas más grandes. stackoverflow.com/questions/2012589/…
blamb
Tenga en cuenta que el DateTimemétodo es el método preferido. Ese objeto puede hacer mucho más que strtotimenunca.
Machavity
new DateTime('now')también funciona para recuperar la fecha de hoy
Breith
23

Solo para complementar las respuestas ya dadas, vea el siguiente ejemplo:

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



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

Actualización: O simplemente use la función date () de la vieja escuela :

if(date('Y-m-d') < date('Y-m-d', strtotime($expire_date))){
    //echo not yet expired! 
}   
d.raev
fuente
1
La fecha es una función, no una clase / constructor.
spdionis
2
@spdionis gracias por el comentario, cambié la letra mayúscula para eliminar la posible confusión.
d.raev el
6

No haría esto con PHP. Una base de datos debe saber qué día es hoy (use MySQL-> NOW (), por ejemplo), por lo que será muy fácil comparar dentro de la consulta y devolver el resultado, sin ningún problema dependiendo de los tipos de fecha utilizados

SELECT IF(expireDate < NOW(),TRUE,FALSE) as isExpired FROM tableName
Dr. Molle
fuente
gracias pero en realidad uso date () no
guardo la
44
Pero almacena expireDate en un db. Compare esta fecha con 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
fuente
2

Aquí hay una manera de cómo obtener la diferencia entre dos fechas en 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
fuente
La pregunta es comparar dos fechas: su respuesta es agregar una carga de cosas adicionales (es decir, establecer el estado en línea / fuera de línea) que no es necesario como respuesta a la pregunta. La parte de su respuesta donde tiene lugar la comparación es prácticamente la misma que la respuesta ya existente aquí .
crazyloonybin
Actualicé la pregunta, publiqué la respuesta incorrecta en la pregunta incorrecta ^^;) No es lo mismo que la respuesta, solo agregué mi opinión sobre cómo compararlos y obtener la diferencia en minutos.
Syno
1
He eliminado mi voto negativo debido a su actualización, ahora se ve mucho mejor :)
crazyloonybin
2

Puede convertir las fechas en marcas de tiempo UNIX y comparar la diferencia entre ellas en 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
fuente
0

También tuve ese problema y lo soluciono:

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

if(($today - $expire) > $NUMBER_OF_DAYS) 
{ 
    //do something; 
}
PiotrK
fuente
Por qué esta técnica funciona debería explicarse en la respuesta.
mickmackusa
Responda la pregunta publicada del OP, no cómo resolvió su propio escenario único.
mickmackusa
0

Aquí está mi giro sobre cómo obtener la diferencia en días entre dos fechas con PHP. Tenga en cuenta el uso de '!' en el formato para descartar la parte de tiempo de las fechas, gracias a la información de DateTime createFromFormat sin tiempo .

$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";
herrero
fuente
-1

Encontré la respuesta en un blog y es tan simple como:

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

Y obtendrá los días entre las 2 fechas.

kooli
fuente
Esto parece estar resolviendo un problema diferente. Por favor solo conteste la pregunta hecha por el OP.
mickmackusa
-1

Esto funciona debido a la lógica de comparación de cadenas de PHP. Simplemente puedes verificar ...

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

Ambas fechas deben estar en el mismo formato. Los dígitos deben estar rellenados con ceros a la izquierda y ordenados del más significativo al menos significativo. Y-m-dy Y-m-d H:i:ssatisfacer estas condiciones.

sanjyot
fuente
1
d-m-Yno funcionará ... Y-m-d(con el cero inicial como 2016-05-08) funcionará. Verifique esas fechas en d-m-Yformato 01-10-2016y 20-02-2016, comparando como cadenas 0 <2, dejará de comparar pero incorrectamente ...
Arxeiss
Aquí hay pruebas de que su técnica no podrá comparar correctamente las fechas del OP con la fecha de hoy: 3v4l.org/SNHKT
mickmackusa
El OP tiene un formato de fecha diferente. parece la fecha 2011-10-2.
mickmackusa
-1

Si desea que una fecha ($ date) expire en algún intervalo, por ejemplo, una fecha de vencimiento de token al realizar un restablecimiento de contraseña, así es como puede hacerlo:

$date = $row->expireDate;

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

$now = new \DateTime();

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

Pero en su caso, podría hacer la comparación de la siguiente manera:

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

$date = $row->expireDate;

if($today < $date) { /* do something */ }
faye.babacar78
fuente
Esta respuesta ignora la pregunta publicada originalmente. Utilice los datos de muestra proporcionados por el OP.
mickmackusa
No es exactamente lo que el hombre está pidiendo ayuda, pero pensé que de esta manera podría ayudar si uno entiende los principios.
faye.babacar78
Entiendo los principios, pero este código no responde la pregunta formulada. Esta página ya está llena de respuestas incorrectas y no relacionadas; esto solo confunde a los investigadores y les hace perder el tiempo. Estoy tratando de buscar investigadores.
mickmackusa
Bueno, creo que no es tan difícil, podría haber usado la clase DateTime () en lugar de la función date (). La respuesta que puse arriba es de alguna manera dar ideas a los investigadores.
faye.babacar78
1
Voy a dejar de repetirme y desconectarme de esta discusión. La segunda solución más alta ( stackoverflow.com/a/3847762/2943403 ) muestra una forma terriblemente simple (inmejorable) de crear dos objetos de fecha y hora. No tengo ni idea de lo que hace su requestDate()método mágico , no se menciona en ningún lado. No usaría su respuesta, ni recomendaría que ningún investigador use su solución. No preveo que cambie mi voto.
mickmackusa
-2

En primer lugar, intente dar el formato que desee a la fecha y hora actual de su servidor:

  1. Obtener la fecha y hora actual

    $ current_date = getdate ();

  2. Fecha y hora separadas para administrarlas como desee:

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

  1. Compárelo dependiendo de si está usando donly date o datetime en su base de datos:

    $ hoy = $ current_date_only ". '. $ current_time_only;

    o

    $ hoy = $ current_date_only;

    if ($ hoy <$ expireDate)

Espero eso ayude

ernestoloredo
fuente
Esta respuesta no intenta resolver la pregunta original. El OP no tiene interés en horas, minutos o segundos.
mickmackusa