Reloj | Pexels
Concluyo esta serie de artículos sobre la reutilización del código fuente como parte de las buenas prácticas dentro del mundo de la programación de sistemas, de hecho es la base del movimiento OpenSource; mediante el cual se pretende dar igualdad de oportunidades a todos los programadores, que todos podamos beneficiarnos del trabajo de otros (evitando tener que "reinventar la rueda"), reduciendo tiempos de trabajo y en general ser más productivos. Claro, para ello hemos de respetar las reglas del juego y en otro post posterior hablaré de esto.
Agradezco a todos los que han visitado estos artículos y han dejado sus comentarios, espero les hallan sido de utilidad, ahora vamos a ver como podemos seguir sacando provecho a funciones que ya hemos desarrollado previamente y podemos reutilizar una y otra vez en otros trabajos para hacer proyectos más ágilmente.
En un artículo anterior mostré como extraer la fecha en formato "dd/mm/yyyy" o "yyyy/mm/dd" usando PHP de una manera sencilla, esto sentó las bases para que posteriormente pudiéramos desarrollar funciones para extraer todos los elementos de una fecha sin tener que preocuparnos por el formato de la fecha (nos elimina la necesidad de volver a programar la validación de fecha las funciones getdateformatfirstday y getdateformatfirstyear). Ahora vamos a ver como usando lo que ya tenemos podemos sumar y restar horas a una fecha con muy poco código fuente y sin tener que preocuparnos por validaciones adicionales.
Previamente en nuestro archivo PHP donde trabajaremos debemos tener ya incluidas las funciones getdateformatfirstday, getdateformatfirstyear, getdayfromdate, getmonthfromdate, getyearfromdate, gethoursfromdate, getminutesfromdate y getsecondsfromdate. Yo recomiendo poner esas funciones en un archivo "functions.php" (por ejemplo) y luego incorporar ese archivo a nuestro archivo de trabajo, algo así como <? include("functions.php"); ?> , esto tendrá como ventaja tener que copiar y pegar todo el código fuente cada vez que vayamos a crear un nuevo proyecto, además si hay modificaciones a esas funciones (parches) todos los proyectos que usen ese archivo de funciones se beneficiarán de las mejoras sin tener que hacer nada prácticamente.
Este el código fuente para sumar y restar horas a una fecha aprovechando las funciones que ya hemos desarrollado previamente:
//thanks to https://stackoverflow.com/questions/2891937/strtotime-doesnt-work-with-dd-mm-yyyy-format
function mystrtotime($str)
{
return strtotime(str_replace("/", "-", $str));
}
function substracthourstodate($date, $hours)
{
if(strpos(".".trim($date), "/") < 1 && strpos(".".trim($date), "-") < 1)
$date = date("Y-m-d H:i:s", time());
$date = getdateformatfirstday(trim($date), true);
$day = getdayfromdate($date);
$month = getmonthfromdate($date);
$year = getyearfromdate($date);
$hour = gethoursfromdate($date);
$minute = getminutesfromdate($date);
$second = getsecondsfromdate($date);
$newdate = mktime($hour, $minute, $second, $month, $day, $year);//echo "date=".$date." FECHA=".$hour.", ".$minute.", ".$second.", ".$month.", ".$day.", ".$year;
$str_ = mystrtotime(trim(date('Y-m-d H:i:s', $newdate))." - ".(int)$hours." hour");
if(trim($str_) == "")
{
//thanks to https://www.w3schools.com/php/func_date_date_create.asp
//thanks to https://stackoverflow.com/questions/26421190/date-strtotime-calculation-returns-1969-date
$newdate = date_create($year."-".$month."-".$day);
$newdate->modify("-".(int)$hours." hour");
$strnewdate = $newdate->format('Y-m-d H:i:s');
}
else
$strnewdate = trim(date('Y-m-d H:i:s', $str_));
return $strnewdate;
}
function addhourstodate($date, $hours)
{
if(strpos(".".trim($date), "/") < 1 && strpos(".".trim($date), "-") < 1)
$date = date("Y-m-d H:i:s", time());
$date = getdateformatfirstday(trim($date), true);
$day = getdayfromdate($date);
$month = getmonthfromdate($date);
$year = getyearfromdate($date);
$hour = gethoursfromdate($date);
$minute = getminutesfromdate($date);
$second = getsecondsfromdate($date);
$newdate = mktime($hour, $minute, $second, $month, $day, $year);//echo "date=".$date." FECHA=".$hour.", ".$minute.", ".$second.", ".$month.", ".$day.", ".$year;
$str_ = mystrtotime(trim(date('Y-m-d H:i:s', $newdate))." + ".(int)$hours." hour");
if(trim($str_) == "")
{
//thanks to https://www.w3schools.com/php/func_date_date_create.asp
//thanks to https://stackoverflow.com/questions/26421190/date-strtotime-calculation-returns-1969-date
$newdate = date_create($year."-".$month."-".$day);
$newdate->modify("+".(int)$hours." hour");
$strnewdate = $newdate->format('Y-m-d H:i:s');
}
else
$strnewdate = trim(date('Y-m-d H:i:s', $str_));
return $strnewdate;
}
///////////////////////////////////////////////////////////
$str = "07/06/2019 18:59:27";
$newdate1 = addhourstodate($str, 8);
$newdate2 = substracthourstodate($str, 5);
echo "Fecha inicial: ".$str."<br><br>";
echo "Fecha inicial + 8 horas: ".$newdate1."<br>";
echo "Fecha inicial - 5 horas: ".$newdate2;
Como podemos observar, tenemos una fecha inicial almacenada en la variable $str, mediante la función addhourstodate podemos sumar horas a una fecha ($str) y con la función substracthourstodate realizar la operación inversa. Fácilmente hemos sumado ocho horas a la fecha contenida en la variable $str y le hemos restado cinco horas del mismo modo. Si ejecutáramos este script en nuestro navegador veríamos la siguiente salida.
Ahora procederemos a explicarlo:
La función addhourstodate recibe como parámetro la fecha que queremos manipular y el número de horas a sumar, para ello validará previamente la fecha proporcionada, en caso de ser incorrecta se usará la fecha actual. Una vez obtenida la fecha con la que trabajaremos procederemos a acomodarla correctamente y a extraer sus partes con las funciones que ya hemos desarrollado previamente:
$date = getdateformatfirstday(trim($date), true);
$day = getdayfromdate($date);
$month = getmonthfromdate($date);
$year = getyearfromdate($date);
$hour = gethoursfromdate($date);
$minute = getminutesfromdate($date);
$second = getsecondsfromdate($date);
Estos datos los usaremos para crear una nueva fecha a la cual le sumaremos el número de horas deseada. Si hubo éxito retornaremos la nueva fecha (notemos que se devuelve en el formato "yyyy-mm-dd hh:mm:ss").
En caso de error crearemos la fecha por otro método:
$newdate = date_create($year."-".$month."-".$day);
$newdate->modify("+".(int)$hours." hour");
$strnewdate = $newdate->format('Y-m-d H:i:s');
En lugar de usar:
$newdate = mktime($hour, $minute, $second, $month, $day, $year);
$str_ = mystrtotime(trim(date('Y-m-d H:i:s', $newdate))." + ".(int)$hours." hour");
Que era nuestra primera opción, ahora solo resta mostrar la nueva fecha. La función substracthourstodate funciona igual, solo que en lugar de sumar las horas las restaremos.
Conclusiones:
Reutilizar código fuente es considerada una buena práctica de la programación como ya mencionamos anteriormente. Esto ha permitido el desarrollo de sistemas mucho más grandes en menos tiempo al reducir el tiempo necesario para programar cosas que ya existen, el código fuente resultante resulta más limpio, probado y sobretodo reutilizable para terceras partes que pudieran beneficiarse del código fuente que nosotros hemos preparado.
Mi intención es aportar un poco de lo que he aprendido todos estos años y compartirlo con otros más, pues así como muchos me han ayudado yo deseo hacer lo mismo, espero sigan visitando este blog y apoyándome. Gracias.
Congratulations @marjuanm! You have completed the following achievement on the Steem blockchain and have been rewarded with new badge(s) :
You can view your badges on your Steem Board and compare to others on the Steem Ranking
If you no longer want to receive notifications, reply to this comment with the word
STOP
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit