Calendario | Pixabay
Que tal, saludos a todos:
Como programadores solemos hacer mucho uso de fechas para consultar datos desde una base de datos, filtrar archivos, guardar registros históricos, etc. Y todo ello requiere manejar fechas correctamente en un lenguaje de programación.
Pues bien, me gustaría compartir con ustedes un par de funciones que he desarrollado con el paso del tiempo, estas dos funciones permiten extraer la fecha correctamente en dos formatos incompatibles pero muy comunes sobretodo en el lenguaje de programación PHP.
Aunque es indistinto como guardemos la fecha en una base de datos, resulta que es muy difícil comparar un registro de fecha en el formato "día/mes/año" contra el formato "año/mes/día", PHP no hace conversiones internas y eso lleva a bastante pérdida de tiempo si tenemos que implementar nosotros mismos esa conversión. Es por ello que comparto estas dos funciones que nos permiten convertir sin problemas una fecha en el formato "día/mes/año" o "dd/mm/yyyy" o en el formato "año/mes/día" o "yyyy/mm/dd".
Para ello veamos el código fuente de la primer función getdateformatfirstday:
function getdateformatfirstday($str, $includehoursminutesandseconds)
{
$valuetoreturn = "";
if(strpos(".".trim($str), "/") < 1 && strpos(".".trim($str), "-") < 1)
return "";
if(substr(trim($str), 2, 1) == "/" || substr(trim($str), 2, 1) == "-")
{
if($includehoursminutesandseconds == true)
$valuetoreturn = substr(trim($str), 0, 19);
else
$valuetoreturn = substr(trim($str), 0, 10);
return $valuetoreturn;
}
else
{
$day = substr(trim($str), 8, 2);
$month = substr(trim($str), 5, 2);
$year = substr(trim($str), 0, 4);
if($includehoursminutesandseconds == true)
{
$hour = substr(trim($str), 11, 2);
$minute = substr(trim($str), 14, 2);
$second = substr(trim($str), 17, 2);
$timestr = trim($hour).":".trim($minute).":".trim($second);
if(endWith(trim($timestr), ":", false) == true) $timestr = substr(trim($timestr), 0, strlen(trim($timestr)) - 1);
}
else
{
$hour = "";
$minute = "";
$second = "";
$timestr = "";
}
$valuetoreturn = trim(trim($day)."/".trim($month)."/".trim($year)." ".trim($timestr));
return $valuetoreturn;
}
}
La función acepta dos parámetros al inicio: $str, $includehoursminutesandseconds, siendo $str la fecha que deseamos convertir y $includehoursminutesandseconds una bandera para indicar si la fecha extraída debe incluir o no la hora, minutos y segundos o si solo retornaremos los días, mes y año solamente.
Internamente vemos que la función comienza revisando el tercer carácter de nuestra cadena de texto, si corresponde a "/" o "-" es un indicador de que nuestra fecha se encuentra de entrada en el formato "dd/mm/yyyy" por lo que procederíamos a extraer esa fecha sin hacer ninguna conversión y añadiendo o no la hora, minutos y segundos.
Pero si ese carácter revisando no corresponde a "/" o "-" entonces procedemos a extraer el día, mes y año con el siguiente código:
$day = substr(trim($str), 8, 2);
$month = substr(trim($str), 5, 2);
$year = substr(trim($str), 0, 4);
Pues a partir de la posición 8 se encuentra el día, mientras que el mes se encuentra en la posición 5 y el año en la posición cero, es decir al inicio de la cadena de texto. Solo restaría anexar la hora, minutos y segundos extrayendolos de las posiciones correctas.
Finalmente en cualquiera de los dos casos retornamos la fecha en el formato que deseamos, en este caso dd/mm/yyyy.
Como nota adicional debemos incorporar las funciones startWith y endWith para que esta función trabaje correctamente, funciones que se anexan en el siguiente código fuente:
<?
//thanks to https://stackoverflow.com/questions/834303/startswith-and-endswith-functions-in-php
function startWith($str, $c, $sensitivity)
{
if(trim($str) == "")
return false;
elseif(strlen(trim($str)) <= 0)
return false;
else
{
if($sensitivity == true)
{
if(strlen(trim($str)) == strlen(trim($c)))
{
if(trim($str) == trim($c))
return true;
else
return false;
}
else
{
if(substr(trim($str), 0, strlen(trim($c))) == trim($c))
return true;
else
return false;
}
}
else
{
if(strlen(trim($str)) == strlen(trim($c)))
{
if(trim(strtolower($str)) == trim(strtolower($c)))
return true;
else
return false;
}
else
{
if(substr(trim(strtolower($str)), 0, strlen(trim($c))) == trim(strtolower($c)))
return true;
else
return false;
}
}
}
}
function endWith($str, $c, $sensitivity)
{
if(trim($str) == "")
return false;
elseif(strlen(trim($str)) <= 0)
return false;
else
{
if($sensitivity == true)
{
if(strlen(trim($str)) == strlen(trim($c)))
{
if(trim($str) == trim($c))
return true;
else
return false;
}
else
{
if(substr(trim($str), (strlen(trim($str)) - strlen(trim($c))), strlen(trim($c))) == trim($c))
return true;
else
return false;
}
}
else
{
if(strlen(trim($str)) == strlen(trim($c)))
{
if(trim(strtolower($str)) == trim(strtolower($c)))
return true;
else
return false;
}
else
{
if(substr(trim(strtolower($str)), (strlen(trim($str)) - strlen(trim($c))), strlen(trim($c))) == trim(strtolower($c)))
return true;
else
return false;
}
}
}
}
function getdateformatfirstday($str, $includehoursminutesandseconds)
{
$valuetoreturn = "";
if(strpos(".".trim($str), "/") < 1 && strpos(".".trim($str), "-") < 1)
return "";
if(substr(trim($str), 2, 1) == "/" || substr(trim($str), 2, 1) == "-")
{
if($includehoursminutesandseconds == true)
$valuetoreturn = substr(trim($str), 0, 19);
else
$valuetoreturn = substr(trim($str), 0, 10);
return $valuetoreturn;
}
else
{
$day = substr(trim($str), 8, 2);
$month = substr(trim($str), 5, 2);
$year = substr(trim($str), 0, 4);
if($includehoursminutesandseconds == true)
{
$hour = substr(trim($str), 11, 2);
$minute = substr(trim($str), 14, 2);
$second = substr(trim($str), 17, 2);
$timestr = trim($hour).":".trim($minute).":".trim($second);
if(endWith(trim($timestr), ":", false) == true) $timestr = substr(trim($timestr), 0, strlen(trim($timestr)) - 1);
}
else
{
$hour = "";
$minute = "";
$second = "";
$timestr = "";
}
$valuetoreturn = trim(trim($day)."/".trim($month)."/".trim($year)." ".trim($timestr));
return $valuetoreturn;
}
}
$str = "07/06/2019 18:59:27";
echo trim(getdateformatfirstday(trim($str), true))."<br>";
$str = "2019/06/07 18:59:27";
echo trim(getdateformatfirstday(trim($str), true))."<br>";
?>
Si esto lo ejecutáramos desde un servidor con PHP configurado correctamente veríamos la siguiente salida en pantalla:
Ahora veamos la función getdateformatfirstyear:
function getdateformatfirstyear($str, $includehoursminutesandseconds)
{
$valuetoreturn = "";
if(strpos(".".trim($str), "/") < 1 && strpos(".".trim($str), "-") < 1)
return "";
if(substr(trim($str), 4, 1) == "/" || substr(trim($str), 4, 1) == "-")
{
if($includehoursminutesandseconds == true)
$valuetoreturn = substr(trim($str), 0, 19);
else
$valuetoreturn = substr(trim($str), 0, 10);
return $valuetoreturn;
}
else
{
$day = substr(trim($str), 0, 2);
$month = substr(trim($str), 3, 2);
$year = substr(trim($str), 6, 4);
if($includehoursminutesandseconds == true)
{
$hour = substr(trim($str), 11, 2);
$minute = substr(trim($str), 14, 2);
$second = substr(trim($str), 17, 2);
$timestr = trim($hour).":".trim($minute).":".trim($second);
if(endWith(trim($timestr), ":", false) == true) $timestr = substr(trim($timestr), 0, strlen(trim($timestr)) - 1);
}
else
{
$hour = "";
$minute = "";
$second = "";
$timestr = "";
}
$valuetoreturn = trim(trim($year)."/".trim($month)."/".trim($day)." ".trim($timestr));
return $valuetoreturn;
}
}
Al igual que la función anterior también acepta un parámetro $str para mandar mediante el la fecha a transformar y una bandera llamada $includehoursminutesandseconds para anexar al final o no la hora, minuto y segundo de la fecha.
Primero revisa si en la posición número 4 (la primer posición siempre es cero) se encuentra el carácter "/" o "-", si esto es cierto entonces se asume que la fecha proporcionada ya se encuentra en el formato yyyy/mm/dd y se devuelve como tal anexando solamente la hora si lo hemos especificado.
Pero si no es así entonces de la fecha que hemos proporcionado se extraerán el día, mes y año mediante el siguiente código fuente:
$day = substr(trim($str), 0, 2);
$month = substr(trim($str), 3, 2);
$year = substr(trim($str), 6, 4);
Para finalmente retornar la fecha correcta junto a la hora si lo requerimos, veamos el código fuente completo de esta función:
<?
//thanks to https://stackoverflow.com/questions/834303/startswith-and-endswith-functions-in-php
function startWith($str, $c, $sensitivity)
{
if(trim($str) == "")
return false;
elseif(strlen(trim($str)) <= 0)
return false;
else
{
if($sensitivity == true)
{
if(strlen(trim($str)) == strlen(trim($c)))
{
if(trim($str) == trim($c))
return true;
else
return false;
}
else
{
if(substr(trim($str), 0, strlen(trim($c))) == trim($c))
return true;
else
return false;
}
}
else
{
if(strlen(trim($str)) == strlen(trim($c)))
{
if(trim(strtolower($str)) == trim(strtolower($c)))
return true;
else
return false;
}
else
{
if(substr(trim(strtolower($str)), 0, strlen(trim($c))) == trim(strtolower($c)))
return true;
else
return false;
}
}
}
}
function endWith($str, $c, $sensitivity)
{
if(trim($str) == "")
return false;
elseif(strlen(trim($str)) <= 0)
return false;
else
{
if($sensitivity == true)
{
if(strlen(trim($str)) == strlen(trim($c)))
{
if(trim($str) == trim($c))
return true;
else
return false;
}
else
{
if(substr(trim($str), (strlen(trim($str)) - strlen(trim($c))), strlen(trim($c))) == trim($c))
return true;
else
return false;
}
}
else
{
if(strlen(trim($str)) == strlen(trim($c)))
{
if(trim(strtolower($str)) == trim(strtolower($c)))
return true;
else
return false;
}
else
{
if(substr(trim(strtolower($str)), (strlen(trim($str)) - strlen(trim($c))), strlen(trim($c))) == trim(strtolower($c)))
return true;
else
return false;
}
}
}
}
function getdateformatfirstyear($str, $includehoursminutesandseconds)
{
$valuetoreturn = "";
if(strpos(".".trim($str), "/") < 1 && strpos(".".trim($str), "-") < 1)
return "";
if(substr(trim($str), 4, 1) == "/" || substr(trim($str), 4, 1) == "-")
{
if($includehoursminutesandseconds == true)
$valuetoreturn = substr(trim($str), 0, 19);
else
$valuetoreturn = substr(trim($str), 0, 10);
return $valuetoreturn;
}
else
{
$day = substr(trim($str), 0, 2);
$month = substr(trim($str), 3, 2);
$year = substr(trim($str), 6, 4);
if($includehoursminutesandseconds == true)
{
$hour = substr(trim($str), 11, 2);
$minute = substr(trim($str), 14, 2);
$second = substr(trim($str), 17, 2);
$timestr = trim($hour).":".trim($minute).":".trim($second);
if(endWith(trim($timestr), ":", false) == true) $timestr = substr(trim($timestr), 0, strlen(trim($timestr)) - 1);
}
else
{
$hour = "";
$minute = "";
$second = "";
$timestr = "";
}
$valuetoreturn = trim(trim($year)."/".trim($month)."/".trim($day)." ".trim($timestr));
return $valuetoreturn;
}
}
$str = "07/06/2019 18:59:27";
echo trim(getdateformatfirstyear(trim($str), true))."<br>";
$str = "2019/06/07 18:59:27";
echo trim(getdateformatfirstyear(trim($str), true))."<br>";
?>
Esta es la respectiva salida en pantalla:
Como pueden ver, independientemente del formato en que pasemos la fecha esta es acomodada al formato requerido. Ahora solo restaría estas funciones guardarlas en un archivo aparte e incluirlo en nuestros proyectos para no tener que estar reescribiendo estas funciones cada vez que las vayamos a usar.
Conclusiones:
Este par de funciones nos va a ser de mucha utilidad cuando queramos convertir fechas al formato dd/mm/yyyy o yyyy/mm/dd, trayendo también como beneficio acelerar el desarrollo de nuestras aplicaciones web. Espero les sea de utilidad y solo me resta invitarlos a que sigan visitando este blog, 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
To support your work, I also upvoted your post!
Vote for @Steemitboard as a witness to get one more award and increased upvotes!
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
thanks.
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
Bueno, te comento que yo no sé absolutamente nada de programación jajaja... pero estoy segura que es una muy buena informacipon para tus colegas. Un abrazo :)
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
Gracias, pues me gusta compartir con otros y ayudar tal como me han ayudado a mi :)
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
Gracias por tu visita.
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
@marjuanm, thank you for supporting @steemitboard as a witness.
Here is a small present to show our gratitude
Click on the badge to view your Board of Honor.
Once again, thanks for your support!
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit