Introducción
Ya vimos cómo obtener los días transcurridos en dos fechas con PHP en un post anterior. Ahora veamos cómo obtener la fecha de mañana, incluso con precisión de segundos.
Por ejemplo, la fecha de hoy que escribo el post es 3 de octubre del 2018 a las 16 con 16 minutos y 18 segundos. La fecha de mañana con precisión de segundos sería 4 de octubre del 2018 a las 16 con 16 minutos y 18 segundos.
Claro que podríamos omitir los minutos y tener únicamente el 4 de octubre del 2018. Pues bien, eso es lo que haremos.
Malos algoritmos
No vamos a poner montones de estructuras if ni descomponer cadenas, utilizaremos las matemáticas. Ya que cualquier persona diría:
Ok hoy es 3 de octubre, tomo el día, le sumo 1 y ya es la fecha de mañana: 4 de octubre
Claro, hasta ahí todo bien, ¿y qué pasa si es 31? ¿sería 32 de octubre? y antes de que respondas, ¿qué tal el 31 de diciembre? ah, y no olvides los años bisiestos.
Por eso es que no vamos a hacer montones de condiciones; utilizaremos las matemáticas y los milisegundos que todo buen lenguaje de programación proporciona.
Cómo obtener la fecha de mañana en PHP
Para obtener la fecha de mañana en PHP debemos saber cuál es la fecha de hoy. Recuerda tener bien tu zona horaria para evitar problemas.
Pues bien, entonces obtenemos la fecha de hoy o la fecha actual usando time
.
Esta función devuelve la fecha actual como un entero, el cual representa el tiempo Unix. Pero no hay que meternos en detalles sobre su origen, basta con saber que devuelve la fecha actual expresada en segundos.
$ahora = time();
A ese número le vamos a sumar lo que es un día expresado en segundos, eso se obtiene de multiplicar 24 horas por 60 minutos que tiene cada hora, por 60 segundos que tiene cada minuto.
24 * 60 * 60 = 86,400
Hacemos la operación, y al sumar, tendremos la representación de la fecha de mañana:
<?php
$unDiaEnSegundos = 24 * 60 * 60;
$manana = $ahora + $unDiaEnSegundos;
Lo único que falta es convertir ese entero a una fecha legible. Y eso lo hacemos llamando a la función date
. Si queremos darle el formato YYYY-MM-DD hacemos lo siguiente:
$mananaLegible = date("Y-m-d", $manana);
De esta manera llamamos a date y le decimos que formatee la fecha como año, mes y día. ¿y cuál fecha? bueno, la fecha es la que está como entero; la que está almacenada en $manana
.
Es importante notar que únicamente estamos usando a date para formatear un entero y convertirlo a fecha, pero la verdadera fecha está en la variable $manana
.
El código completo queda así:
<?php
/*
Fecha de mañana en PHP
parzibyte.me/blog
*/
$ahora = time();
$unDiaEnSegundos = 24 * 60 * 60;
$manana = $ahora + $unDiaEnSegundos;
$mananaLegible = date("Y-m-d", $manana);
# ahoraLegible únicamente es para demostrar
$ahoraLegible = date("Y-m-d", $ahora);
echo "Hoy es $ahoraLegible y mañana es $mananaLegible";
La salida es la siguiente:
No estamos limitados a usar ese formato para date
. Podemos usar cualquiera de los que se listan aquí.
Lo que hay que notar es que utilizando matemáticas dimos con el resultado. Ya a esa fecha podemos imprimirla, guardarla, formatearla o lo que se nos dé la gana.
Si quieres saber cómo ejecutar un archivo PHP haz click aquí.
Más precisión
Arriba simplemente mostramos el año, mes y día. Pero con los segundos podemos obtener precisión de segundos. Si queremos mostrar la fecha y hora de mañana usamos este código:
<?php
/*
Fecha de mañana en PHP, con precisión de segundos
parzibyte.me/blog
*/
$ahora = time();
$unDiaEnSegundos = 24 * 60 * 60;
$manana = $ahora + $unDiaEnSegundos;
$mananaLegible = date("Y-m-d H:i:s", $manana);
# ahoraLegible únicamente es para demostrar
$ahoraLegible = date("Y-m-d H:i:s", $ahora);
echo "Hoy es $ahoraLegible y mañana es $mananaLegible";
No hemos movido nada más que los modificadores para formatear la fecha. Usamos H
para la hora, i
para los minutos y s
para los segundos. La salida es:
Hoy es 2018-10-03 17:26:46 y mañana es 2018-10-04 17:26:46
Otra solución más elegante
Si no somos muy fanáticos de las matemáticas, o queremos ser elegantes aquí dejo otra solución.
Dicha solución utiliza <em>strtotime</em>
que se traduce como “cadena a tiempo”, la cual recibe como primer argumento una cadena (puede ser una fecha o algún modificador válido) y como segundo argumento opcional recibe un entero representando los segundos.
Esa función devuelve un entero igualmente, en donde ha puesto el resultado de operar la fecha como cadena con el segundo argumento que recibe.
Pero hablar es de mal gusto, aquí el código:
<?php
/*
Fecha de mañana en PHP, de manera elegante
parzibyte.me/blog
*/
$ahora = time();
# Le decimos que ahora, + 1 día
$manana = strtotime("+1 day", $ahora);
$mananaLegible = date("Y-m-d", $manana);
# ahoraLegible únicamente es para demostrar
$ahoraLegible = date("Y-m-d", $ahora);
echo "Hoy es $ahoraLegible y mañana es $mananaLegible";
Casi nada cambia, lo único que hacemos es que con strtotime
indicamos sumar un día con la cadena +1 day.
Ya con esto nos damos cuenta de que podemos obtener la fecha del siguiente mes, el siguiente año o incluso la fecha de ayer.
Nota: mira más ejemplos de strotime aquí.
Es importante notar que devuelve un entero que más tarde formateamos, justo como lo hacíamos con los otros métodos.
Recuerda que puedes dejar un comentario si tienes dudas.
Pingback: Fecha de ayer y de mañana en JavaScript - Parzibyte's blog
Pingback: PHP y strtotime para manipular fechas - Parzibyte's blog
Pingback: Formateando fechas en PHP con la función date - Parzibyte's blog