2010-10-02 31 views
92

¿Cómo puedo comparar dos fechas en PHP?Comparando dos fechas

En la base de datos, la fecha se ve como 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?

He intentado esto,

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

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

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

Actualización: Sé que esta publicación es un poco antigua, pero solo quería mencionar carbono, que es una clase que se usa con laravel pero que se puede usar con php clásico y que hace maravillas con las fechas. Hay que ver: Carbon

+0

Asigne las fechas de db a un objeto DateTime y luego compare esos objetos. Puede encontrar un buen ejemplo en http://stackoverflow.com/questions/961074/how-do-i-compare-two-datetime-objects-in-php-5-2-8 – Peter

+0

La respuesta seleccionada a esta pregunta (casilla verde) es bueno para algunas aplicaciones; La respuesta de @Hugo Peixoto es sin duda la mejor respuesta general a esta pregunta. – Aaron

Respuesta

63

en la base de datos de la fecha es el siguiente 2011-10-2

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

+2

, pero qué ocurre si se ven así, 2011-10-02 y 2012-02-10, para la comparación de mes 1> 0, pero 2011-10-02 <2012-02-10 – dav

+12

@Davo, la comparación se detiene en la primera personaje que es diferente. En este caso, el cuarto dígito de '1' <'2', para obtener el resultado que espera. – Matthew

+1

Lo siento :), no fue lo suficientemente cuidadoso. – dav

164

Si todas las fechas son posteriores al 1 de enero del 1970, se podría utilizar algo como:

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

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

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

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

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

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

O algo así.

+16

Esta es una mejor respuesta. – ChristoKiwi

+0

Si no recuerdo mal, la preocupación por el '1 de enero de 1970' solo se aplica a las versiones anteriores de PHP que se ejecutan en ** Windows ** y nunca fue un problema en Unix. –

+0

Me gusta esta respuesta. Es una gran opción convertir fechas en strtotime() –

1

This podría ayudar si está considerando usar DateTimes.

+0

No usa DateTimes. El fragmento muestra la función 'fecha'. – zneak

+0

Veo eso, pero seguramente es posible convertir una fecha a DateTime? No soy un Desarrollador de PHP. –

6

No haria 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 compararla en la consulta y devolver el resultado, sin ningún problema según los tipos de fecha

SELECT IF(expireDate < NOW(),TRUE,FALSE) as isExpired FROM tableName 
+0

gracias, pero en realidad uso date() No almaceno la fecha de hoy en un db –

+2

Pero usted almacena expireDate en un db. Compare esta fecha con NOW() –

+0

actualizó mi respuesta con un ejemplo –

17

Sólo para complementar las respuestas ya dadas, véase el siguiente ejemplo:

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



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

actualización: O simple uso de la vieja escuela función date():

if(date('Y-m-d') < date('Y-m-d', strtotime($expire_date))){ 
    //echo not yet expired! 
} 
+1

La fecha es una función, no una clase/constructor. – spdionis

+0

@spdionis gracias por el comentario. Cambié la letra mayúscula para eliminar posibles confusiones. –

1

Puede usar PHP sencilla de comparar fechas:

$date = new simpleDate(); 
echo $date->now()->compare($expire_date)->isBeforeOrEqual(); 

Esto le dará la verdadera o falsa.

Puede consultar los tutoriales para ver más ejemplos. Por favor, click here.

1

tuve ese problema y resolverlo por:

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

if(($today - $expire) > $NUMBER_OF_DAYS) 
{ 
    //do something; 
} 
2
$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

encontrado la respuesta en VipDomaine blog y que es tan simple como:

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

y obtendrá la días entre las 2 fechas.

2
$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); 
$timeDiff = $diff->format("%R%a days"); 

echo $timeDiff; 
if($timeDiff < 0){ 
    echo "Expired."; 
}else{ 
    echo "Not expired."; 
} 
0

Simplemente se puede comprobar ..

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

pero ambas fechas deben estar en el mismo formatlike

Y-m-d o d-m-Y

etc.

+1

'd-m-Y' no funcionará ..' Y-m-d' (con cero inicial como 2016-05-08) funcionará. Compruebe esas fechas en formato 'dmY' 01-10-2016' y' 20-02-2016', comparando como cadenas 0 <2, se detendrá comparando pero incorrectamente ... – Arxeiss

0
while ($row=mysql_fetch_array($result)) 
    { 


     $orderdate=explode('-',$row['alertdate']); 
     $date=$orderdate[0]; 
     $month=$orderdate[1]; 
     $year=$orderdate[2]; 

     if((date(Y)>=$year) and (date(m)>=$month) and (date(d)>=$date)) 
     { 
      //write your true code 

     } 
     else 
     { 
      //write your false code 
     } 
+0

¿Puede explicar los códigos un poco pls – GGO

1

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; 
+0

La pregunta es para comparar 2 fechas: su respuesta es agregar un montón 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 la comparación tiene lugar es prácticamente la misma que la respuesta existente [aquí] (https://stackoverflow.com/a/3847762/1561469). – crazyloonybin

+0

Actualicé la pregunta, publiqué la respuesta incorrecta en la pregunta incorrecta ^^;) No es lo mismo que la respuesta, simplemente agregué mi opinión sobre cómo compararlos y obtener la diferencia en minutos. – Syno

+1

He eliminado mi downvote debido a su actualización, se ve mucho mejor ahora :) – crazyloonybin