Comparar Fechas en PHP

Distintos métodos para comparar fechas correctamente en PHP

Función strtotime

La forma más sencilla de comparar dos fechas es utilizando la función de PHP strtotime que convierte una fecha escrita en una cadena correctamente formateada a un UNIX timestamp, que es como estos sistemas operativos interpretan las fechas (en segundos). Utilizar esta función conlleva un serio problema que veremos más abajo.

$fecha_actual = strtotime(date("d-m-Y H:i:00",time())); $fecha_entrada = strtotime("19-11-2008 21:00:00");

if( $fecha_actual > $fecha_entrada ){
  echo "La fecha entrada ya ha pasado";
}else{
  echo "Aun falta algun tiempo";
}

El problema de trabajar con marcas de tiempo Unix es que el rango de fechas posibles termina sobre el año 2030, es decir que a partir de ese año, como no hay más dígitos para representar una cifra superior se reiniciará a 0 (equivalente al año 1970 aproximadamente). Aunque falte mucho tiempo, es una mala práctica emplear este tipo de factores.

Comparar Fechas Correctamente

Una forma sencilla de hacerlo sin tener que contar manualmente las fechas, con todo los problemas que esto conlleva: si es año bisiesto o no, si el mes termina en 30 o 31, etc..., lo que se puede hacer es cambiar el sistema de fechas de gregoriano a juliano, para saber la diferencia de días que hay entre dos fechas

function compararFechas($primera, $segunda)
{
  $valoresPrimera = explode ("/", $primera);  
  $valoresSegunda = explode ("/", $segunda);

  $diaPrimera = $valoresPrimera[0];  
  $mesPrimera = $valoresPrimera[1];  
  $anyoPrimera = $valoresPrimera[2];

  $diaSegunda = $valoresSegunda[0];  
  $mesSegunda = $valoresSegunda[1];  
  $anyoSegunda = $valoresSegunda[2];

  $diasPrimeraJuliano = gregoriantojd($mesPrimera, $diaPrimera, $anyoPrimera);  
  $diasSegundaJuliano = gregoriantojd($mesSegunda, $diaSegunda, $anyoSegunda);

  if(!checkdate($mesPrimera, $diaPrimera, $anyoPrimera)){
    // "La fecha ".$primera." no es válida";
    return 0;
  } elseif (!checkdate($mesSegunda, $diaSegunda, $anyoSegunda)){
    // "La fecha ".$segunda." no es válida";
    return 0;
  } else {
    return $diasPrimeraJuliano - $diasSegundaJuliano;
  }
}

$primera = "29/02/2000";
$segunda = "31/01/2000";

echo compararFechas ($primera,$segunda);

Este código devuelve el número de días entre dos fechas en caso de que sean válidas (se utiliza la función checkdate de PHP para comprobar que sean fechas válidas).