Calcular fecha futura o pasada con PHP

Hay veces que necesitamos que nuestro sistema calcule automáticamente que fecha será dentro de X días, o X meses, o X años a partir de la fecha actual o de una fecha determinada. Hoy les traigo una función sencilla para lograr ésto, esta función determinará la fecha pasando le ciertos parámetros  El código es el siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function calculaFecha($modo,$valor,$fecha_inicio=false){
 
   if($fecha_inicio!=false) {
          $fecha_base = strtotime($fecha_inicio);
   }else {
          $time=time();
          $fecha_actual=date("Y-m-d",$time);
          $fecha_base=strtotime($fecha_actual);
   }
 
   $calculo = strtotime("$valor $modo","$fecha_base");
 
   return date("Y-m-d", $calculo);
 
}
function calculaFecha($modo,$valor,$fecha_inicio=false){

   if($fecha_inicio!=false) {
          $fecha_base = strtotime($fecha_inicio);
   }else {
          $time=time();
          $fecha_actual=date("Y-m-d",$time);
          $fecha_base=strtotime($fecha_actual);
   }

   $calculo = strtotime("$valor $modo","$fecha_base");

   return date("Y-m-d", $calculo);

}

Como se puede ver la función acepta tres parámetros, el primero es el modo, que nos permite elegir que tipo de valor le vamos a pasa a la función, si días, meses o años. El formato en el que le vamos a pasa este parámetro es el siguiente: para días simplemente days, para meses months y para años years. El segundo parámetro son los días, meses o años, dependiendo del modo, que queremos adelantar o retroceder. Para adelantar utilizamos números positivos y para retroceder utilizamos números negativos. El tercer parámetro es opcional y sirve para calcular la fecha en base a una fecha de inicio. Por ejemplo si estamos en la fecha 2012-07-25 pero queremos calcular que fecha será 30 días después de la fecha 2012-09-20 simplemente le pasamos la última como tercer parámetro y el resultado será 2012-10-20. El ejemplo de llamada a la función se vería así:

1
echo calculaFecha("days",30,"2012-09-20");
echo calculaFecha("days",30,"2012-09-20");

El único inconveniente de la función es que no puede ser utilizada para calcular fechas mayores a el 2038 o menores a 1902 (diciembre de 1901) en sistemas de 32 bits o en Windows y en algunas distribuciones Linux hasta el año 1970 como mínimo. En es caso de servidores con versiones de 64 bits pueden obtenerse rangos de fechas básicamente infinitos.

Espero la función haya sido de utilidad y si tienes dudas comenta!

Author: gp2

Desarrollador Web, Programador PHP y MySQL, conocedor de HTML5, CSS3 y Javascript. Del culto JQuery, gran coleccionador de funciones ajenas y especialista en hacer código redundante. Últimamente programador Java.

6 comentarios en “Calcular fecha futura o pasada con PHP

  1. Es más sencillo utilizando strtotime y pasando como parametros la fecha base(opcional), cantidad de dias, meses, años o lo que sea. Ejemplo:

    $hoy=date(“Y-m-d”);
    $ayer=date(“Y-m-d”,strtotime($hoy.’ – 1 day’));
    $mañana=date(“Y-m-d”,strtotime($hoy.’ + 1 day’));
    $hace_una_semana=date(“Y-m-d”,strtotime($hoy.’ – 1 week’));
    $dentro_de_una_semana=date(“Y-m-d”,strtotime($hoy.’ + 1 week’));
    $hace_un_mes=date(“Y-m-d”,strtotime($hoy.’ – 1 month’));
    $dentro_de_un_mes=date(“Y-m-d”,strtotime($hoy.’ + 1 month’));
    $hace_un_año=date(“Y-m-d”,strtotime($hoy.’ – 1 year’));
    $dentro_de_un_año=date(“Y-m-d”,strtotime($hoy.’ + 1 year’));

    Así mismo, si se quisieran calcular en base a una fecha, pues es tan solo reemplazar $hoy por la fecha de inicio. Pero tiene los mismos problemas que comentas con los servidores.

      1. llevo mucho tiempo buscando la manera de resolver esto: quiero generar una accion cada dia expesifico de cada mes por ej:(15 y 30 c/mes) pero esto solo sucedera cuando el usuario carge la pagina, como puedo hacer que esto se ejecute de manera auto. sin la intervension del usuario o de cargar la pagina.

  2. llevo mucho tiempo buscando la manera de resolver esto: quiero generar una accion cada dia expesifico de cada mes por ej:(15 y 30 c/mes) pero esto solo sucedera cuando el usuario carge la pagina, como puedo hacer que esto se ejecute de manera auto. sin la intervension del usuario o de cargar la pagina.

Deja un comentario