Cómo Sumar o Restar Días, Meses y Años a una Fecha Fácilmente con PHP

Es bastante común que al desarrollar algunos proyectos de aplicaciones en php se requiera el sumar o restar días, meses o años a una determinada fecha, ya sea para calcular la fecha en que termina un periodo o los días, meses o años que han transcurrido a partir de un evento.

En este artículo comparto contigo una forma muy fácil de resolver esto con una simple función. Primero vamos a ver cuál es, te voy a explicar cada una de sus parte para que la comprendas, veremos cómo llamarla y veremos un ejemplo práctico.

1. Función para Sumar o Restar Días, Meses y/o Años a una Fecha

Esta es la función y sólo requiere dos parámetros y dos líneas de código:

<?php

// Función para Sumar o Restar días, meses y/o años a una Fecha

function newFecha($fecha, $dias, $meses, $anios){

list($year, $mon, $day) = explode('-', $fecha);

return date('Y-m-d', mktime(0, 0, 0, $mon+$meses, $day+$dias, $year+$anios));

}

// Parámetros a pasar a la Función para el cálculo

$fecha = date('Y-m-d');
$dias = 10;
$meses = 0;
$anios = 0;

// Para invocar la función y asignar el resultado a una variable

$nuevafechanewFecha($fecha, $dias, $meses, $anios);

 

// Para invocar la función e imprimir directamente el resultado

echo newFecha($fecha, $dias, $meses, $anios);

?>

Veamos la explicación.

1. La función newFecha requiere de cuatro parámetros para realizar el cálculo:

       function newFecha($fecha, $dias, $meses, $anios){

       $fecha = Es la Fecha a la que se le sumarán o restarán los días.
       $dias = Son el número de días que se sumarán o restarán a la fecha indicada.
       $meses = Son el número de meses que se sumarán o restarán a la fecha indicada.
       $anios = Son el número de anios que se sumarán o restarán a la fecha indicada.

Recuerda que esta función puede sumar o restar días, meses y/o años a la fecha inicial, por lo que si quieres restar días, meses o años estas variables deben ser un número entero negativo, si quieres sumar días, meses o años deben ser un número entero. Y si no quieres sumar o restar días, meses o años, simplemente deja esa variable en 0 (cero).

2. Se necesita obtener por separado el año, mes y día de la fecha a la que se va a sumar o restar días, meses y/o años:

       explode('-', $fecha);

explode() es una función de php que divide una cadena en varias cadenas y las asigna a un array (conjunto de valores) dependiendo del limitador que se indique en la función. En nuestro ejemplo, explode se aplica a la fecha que nos interesa sumar o restar días, meses y/o años.

En nuestro caso la fecha está en el formato por default de MySql para el tipo de datos de fecha "date" el cual es: 2017-08-15. Pero tú puedes adaptar esto de acuerdo a como estés manejando las fechas en tu aplicación.

La primera parte de la función es el limitador, que en nuestro caso es un guion medio (-), indicando así que la fecha se debe dividir en donde encuentre ese guion medio.

El resultado de la función sería lo siguiente:

        La primera cadena es el año = 2017
        La segunda cadena es el mes = 08
        La tercera cadena es el día = 15

De esta forma ya tenemos en forma separada el año, mes y día de la fecha a la que vamos a sumar o restar los días, meses y/o años.

3. Se necesita asignar el año, mes y día a variables para poder hacer el cálculo final.

       list($year, $mon, $day)

Para asignar la fecha, año y día que obtuvimos con explode(), vamos a usar list(), que no es una función si no un constructor del lenguaje php, y se usa para asignar una lista de variables en una sola operación y sólo funciona con datos numéricos

Es importante notar, que el orden de las variables en list(), debe ser igual al orden en que se encuentran los datos obtenidos con explode(). Es decir, primero debemos poner la variable del año ($year), después la variable del mes ($mon) y por último la variable que recibirá el valor del día ($day). Si tienes otro orden en tu fecha de explode(), debes adaptar el orden en list() para que corresponda correctamente.

4. Se debe realizar la suma o resta de los días, meses y años a la fecha indicada y devolver el valor como return.

       return date('Y-m-d', mktime(0, 0, 0, $mon+$meses, $day+$dias, $year+$anios));

Aquí es donde sucede la magia, donde realmente obtenemos la nueva fecha una vez sumados o restados los días, meses o años indicados.

Primero debemos comprender la parte de mktime(0,0,0, $mon+$meses, $day+$dias, $year+$anios), que es donde se realiza la suma o resta de los días, meses y/o años.

mktime(), es una función de php que devuelve una marca de tiempo (timestamp) Unix de una fecha proporcionada.

Los seis parámetros que requiere la función mktime() son, de izquierda a derecha:

       mktime(hora, minutos, segundos, mes, día, año).

Wikipedia: "Tiempo Unix o Tiempo POSIX es un sistema para la descripción de instantes de tiempo: se define como la cantidad de segundos transcurridos desde la medianoche UTC del 1 de enero de 1970, sin contar segundos intercalares. Es universalmente usado no solo en sistemas operativos tipo-Unix, sino también en muchos otros sistemas computacionales. No se trata ni de una representación lineal del tiempo, ni de una representación verdadera de UTC (a pesar de que frecuentemente se lo confunde con ambos), pues el tiempo que representa es UTC, pero no tiene forma de representar segundos bisiestos de UTC."
Ejemplo: 1502119588 (2017-08-07 15:26:28Z).

Continuando con nuestro ejemplo, puedes observar que en horas, minutos y segundos, asignamos el valor de cero (0). Esto lo hacemos así porque en realidad no nos interesan esos valores, ya que estamos sumando días, meses y/o años a la fecha. Si quisiéramos sumar segundos, minutos o las horas, entonces sí sería importante definir esto correctamente.

Puedes observar que hemos asignado como mes el valor de la variable $mon, en año hemos asignado el valor de la variable $year, y en día hemos asignado la variable $day, pero si te fijas también estamos sumando (+) a esas variables $mon, $day y $year el número de días, meses o años que queremos sumar o restar, asignados en los parámetros $dias, $meses y $años que pasamos a través de la función.

Para Sumer Días, Meses o Años a la Fecha: Si quieres sumar días, meses o años a la fecha, el valor de los parámetros $días, $meses y $anios tienen que ser un entero positivo (sin el signo de +). Ejemplo: 7.

Para Restar Días, Meses o Años a la Fecha: Si quieres restar días, meses o años a la fecha, el valor de los parámetros $días, $meses y $anios tienen que ser un entero negativo (con el signo -). Ejemplo: -7.

Si NO se quiere Sumar o Restar Días, Meses o Años a la Fecha: Para esto debes asignar el valor de 0 (cero) al parámetro que no quieres sumar o restar, sea $días, $meses y/o $anios.  

5. Convertir la nueva fecha de Formato de Tiempo Unix a Formato de Fecha que requieras.

Ahora tienes que convertir de tiempo Unix al formato de fecha MySql (que es el que estamos usando en este ejemplo). Para esto usamos la función: 

       date('Y-m-d', mktime(0,0,0,$mon+$meses, $day+$dias, $year+$anios));

La función date(), puede usar un parámetro o dos, dependiendo de lo que queremos que nos devuelva.

Si queremos que nos devuelva la fecha actual al momento de ejecutar la función, tenemos que usar la función como sólo un parámetro: date('Y-m-d-').

Pero en nuestro ejemplo lo que queremos es que nos devuelva el formato MySql de la fecha pero con el resultado de haber sumado o restado los días,meses y/o años a la fecha indicada, la cual ya tenemos pero con formato de Tiempo Unix.

Por eso debemos usar la función date() con dos parámetros:

       date('Y-m-d', 'Tiempo Unix')

Sustituyéndolo se vería algo como lo siguiente:

       date('Y-m-d', '1503352800') 

Esto nos daría la fecha formateada de la siguiente manera:

       '2017-08-25'

6. Devolver el valor de la nueva fecha obtenida al ejecutar la función.

Finalmente lo único que nos queda es devolver la nueva fecha que hemos obtenido al sumar o restar los días que hemos indicado.

Para esto usamos return, que es un Constructor de Leguaje php que termina la ejecución de la función y devuelve el valor obtenido a quien invocó la función.

Recuerda que return no imprime el resultado de la función. Por lo que podemos hacer dos cosas con esto:

      1. Asignamos el resultado de la función a una variable y entonces usamos esta variable como queramos en nuestra aplicación, ya sea para más cálculos o para imprimirla posteriormente.

      2. Podemos imprimir el resultado si antes de invocar (llamar) la función incluimos la sentencia echo. De esta forma el resultado se imprimirá directamente sin asignarlo a una variable.

2. Invocar la Función para Sumar o Restar Días, Meses y/o Años a la Fecha indicada.

Ahora que ya comprendemos muy bien la función para sumar o restar días, meses y/o años a una fecha determinada, es el momento de saber cómo debemos invocar está función en nuestra aplicación.

Como vimos en el punto anterior, podemos invocar la función para asignar el resultado a una variable o podemos invocarla para imprimirla directamente. Veamos cada una de ellas.

1. Invocar la función para imprimir directamente el resultado devuelto por la función:

En el siguiente ejemplo sólo vamos a sumar días, pero recuerda que pueden ser meses o años o los tres parámetros al mismo tiempo.

Código:
<?php
// Asignamos la fecha a la que queremos sumar o restar días
$fecha = '2017-08-15';
// Asignamos el número de días que queremos sumar
$dias = 10;
// Asignamos el número de meses que queremos sumar
$meses = 0;
// Asignamos el número de años que queremos sumar
$anios = 0;

// La función para sumar o restar días
function newFecha($fecha, $dias, $meses, $anios){
      list($year, $mon, $day) = explode('-', $fecha);
      return date('Y-m-d', mktime(0,0,0,$mon+$meses, $day+$dias, $year+$anios));
}

// Invocamos la función para imprimir el resultado
// Como sólo queremos sumar 10 días a la fecha, asignamos
// 0 (cero) a $meses y 0 (cero) a $anios

echo '2017-08-15 más 10 días es igual a: ';
echo newFecha($fecha, $dias, $meses, $anios);
?>

Resultado:
2017-08-15 más 10 días es igual a: 2017-08-25

Comentarios:
Como puedes observar invocas la función pasando los parámetros de la fecha y los días que sumarás, y la función devuelve la nueva fecha y con echo la imprimes directamente.

También debes de notar que al invocar la función no ponemos la palabra function sino que sólo ponemos el nombre de la función, que en este caso es newFecha.

2. Invocar la función para asignar a una variable el valor devuelto por la función:

Código:
<?php
// Asignamos la fecha a la que queremos sumar o restar días
$fecha = '2017-08-15';
// Asignamos el número de días que queremos sumar
$dias = 10;
// Asignamos el número de meses que queremos sumar
$meses = 0;
// Asignamos el número de añosque queremos sumar
$anios = 0;

// La función para sumar o restar días
function newFecha($fecha, $dias, $meses, $anios){
      list($year, $mon, $day) = explode('-', $fecha);
      return date('Y-m-d', mktime(0,0,0,$mon+$meses, $day+$dias, $year+$anios));
}

// Invocamos la función para asignar el resultado a la variable $nuevafecha
// Como sólo queremos sumar 10 días a la fecha, asignamos
// 0 (cero) a $meses y 0 (cero) a $anios

$nuevafecha = newFecha($fecha, $dias, $meses, $anios);

// Una vez asignado el resultado a la variable imprimimos esa variable
echo "2017-08-15 más 10 días es igual a: $nuevafecha";
?>

Resultado:
2017-08-15 más 10 días es igual a: 2017-08-25

Comentarios:
En esta ocasión asignaste el valor directamente a la variable $nuevafecha, y después la usas para imprimirla en pantalla con la sentencia echo.

Observación: Como puedes observar en el ejemplo anterior, cuando imprimimos la variable $nuevafecha usamos la sentencia echo para imprimir la cadena "2017-08-15 más 10 días es igual a: $nuevafecha", incluyendo la variable dentro de la cadena delimitada por comillas dobles (").

Esto lo hacemos para evitar la concatenación de la variable $nuevafecha. De esta manera nuestro código es más eficiente y nosotros como programadores somos más productivos.

Importante: Cuando incluimos variables dentro de una cadena y queremos que se impriman sus valores y no el nombre de las variables FORZOSAMENTE debemos utilizar comillas dobles ("). Si usamos comillas simples (') se imprimirá el nombre de la variable y no su valor.

3. Comentarios Finales

Hasta aquí este artículo, espero que te sea de ayuda en el desarrollo de tus aplicaciones. Te sugiero que lo practiques, que pruebes con todas las opciones, como sumar días, restar días, sumar meses y/o años y usarlo con años bisiestos.

Además te invito para que compartas con nosotros cualquier cometario que tengas en relación con el artículo.

Jesús Rivera
SieteCifras.com


Deja Tu Comentario

Nombre
Email
Website
Mensaje

No Hay Comentarios