Funciones en PHP para obtener todos los elementos de una fecha

in #php6 years ago

Reloj | Pixabay

  En un artículo anterior publiqué como "Como convertir una fecha al formato "dd/mm/yyyy" o "yy/mm/dd" desde PHP" (artículo que pueden leer haciendo clic en este enlace), agradezco a quienes lo visitaron y dejaron algunos comentarios, muchas gracias.

  Bien, tomando como base las funciones getdateformatfirstday y getdateformatfirstyear vamos a empezar a construir funciones que aprovechen su finalidad (retornar la fecha en el formato deseado - sin importar el orden en que mandemos la información) y extraer datos útiles de la fecha retornada. Para ello comparto con ustedes una serie de funciones que nos permitirán extraer todos los componentes de una fecha, como lo es el día, mes, año, hora, minuto y segundo de la misma. No importa que la fecha la proporcionemos en el formato "dd/mm/yyyy" (día, mes, año) o "yyyy/mm/dd" (año, mes, día).

  En nuestro archivo PHP ya debemos tener anexada previamente la función getdateformatfirstday (sea que copiemos la función al archivo donde trabajemos o que la incluyamos desde un archivo externo - recomendado esto último), ahora anexaremos estas funciones:

function getdayfromdate($str)

{


  if(trim($str) == "")

    return "00";

  else

  {

  

    $validdate = getdateformatfirstday(trim($str), false);

    

    if(trim($validdate) == "")

      return "00";

    else

    {

    

      $day = substr(trim($validdate), 0, 2);

      

      if(strlen(trim($day)) < 2)

      {

      

        if(strlen(trim($day)) == 0)

          return "00";

        else

          return "0".trim($day);

          

      }

      else

        return trim($day);

        

    }

  

  }

  

}


function getmonthfromdate($str)

{


  if(trim($str) == "")

    return "00";

  else

  {

  

    $validdate = getdateformatfirstday(trim($str), false);

    

    if(trim($validdate) == "")

      return "00";

    else

    {

    

      $month = substr(trim($validdate), 3, 2);

      

      if(strlen(trim($month)) < 2)

      {

      

        if(strlen(trim($month)) == 0)

          return "00";

        else

          return "0".trim($month);

          

      }

      else

        return trim($month);

        

    }

  

  }

  

}


function getyearfromdate($str)

{


  if(trim($str) == "")

    return "0000";

  else

  {

  

    $validdate = getdateformatfirstday(trim($str), false);

    

    if(trim($validdate) == "")

      return "0000";

    else

    {

    

      $year = substr(trim($validdate), 6, 4);

      

      if(strlen(trim($year)) < 4)

      {

      

        if(strlen(trim($year)) == 0)

          return "0000";

        elseif(strlen(trim($year)) == 1)

          return "000".trim($year);

        elseif(strlen(trim($year)) == 2)

          return "00".trim($year);

        elseif(strlen(trim($year)) == 3)

          return "0".trim($year);

        else

          return "0000";

          

      }

      else

        return trim($year);

        

    }


  }

  

}


function gethoursfromdate($str)

{


  if(trim($str) == "")

    return "00";

  else

  {

  

    $validdate = getdateformatfirstday(trim($str), true);

    

    if(trim($validdate) == "")

      return "00";

    else

    {

    

      $hour = substr(trim($validdate), 11, 2);

      

      if(strlen(trim($hour)) < 2)

      {

      

        if(strlen(trim($hour)) == 0)

          return "00";

        else

          return "0".trim($hour);

          

      }

      else

        return trim($hour);

        

    }

  

  }

  

}


function getminutesfromdate($str)

{


  if(trim($str) == "")

    return "00";

  else

  {

  

    $validdate = getdateformatfirstday(trim($str), true);

    

    if(trim($validdate) == "")

      return "00";

    else

    {

    

      $minutes = substr(trim($validdate), 14, 2);

      

      if(strlen(trim($minutes)) < 2)

      {

      

        if(strlen(trim($minutes)) == 0)

          return "00";

        else

          return "0".trim($minutes);

          

      }

      else

        return trim($minutes);

        

    }

  

  }

  

}


function getsecondsfromdate($str)

{


  if(trim($str) == "")

    return "00";

  else

  {

  

    $validdate = getdateformatfirstday(trim($str), true);

    

    if(trim($validdate) == "")

      return "00";

    else

    {

    

      $seconds = substr(trim($validdate), 17, 2);

      

      if(strlen(trim($seconds)) < 2)

      {

      

        if(strlen(trim($seconds)) == 0)

          return "00";

        else

          return "0".trim($seconds);

          

      }

      else

        return trim($seconds);

        

    }

  

  }

  

}

  Todas estas funciones utilizan internamente a la función getdateformatfirstday para retornar la fecha en el formato correcto, si la fecha inicial proporcionada es inválida (porque no proporcionamos nada o no tiene el formato correcto para una fecha) retornaremos 00 si se trata de un día, mes, hora, minuto o segundo y 0000 si se trata de un año lo que queremos consultar. De esa manera evitaremos que internamente la función pueda colapsar al sistema.

  Si la fecha inicial proporcionada si es válida entonces la convertiremos al formato que necesitamos para trabajar (dd/mm/yyyy hh:mm:ss - día, mes, año, hora, minuto y segundo). Una vez que ya la tengamos lista ahora vamos a extraer los datos que nos interesan:

  getdayfromdate extraerá el día de esa fecha proporcionada (previamente formateada usando la función getdateformatfirstday), se extraerán los primeros dos caracteres mediante la siguiente instrucción $day = substr(trim($validdate), 0, 2);

  Donde 0 (cero) nos representa el inicio de la cadena de texto (la fecha a analizar). En la mayoría de los lenguajes de programación la primera posición siempre es 0 (la única excepción que he visto hasta ahora es Visual Basic 5 y 6 - desconozco si en versiones previas esto también existía - donde siempre se comenzaba en 1. Por cierto, esto ya se ha descontinuado en Visual Basic .NET, VB.NET ya usa 0 para comenzar a leer una posición inicial). Bueno, como decíamos, se leerán las primeras dos posiciones, desde 0 hasta 2, donde 2 es el tamaño del dato que queremos leer (nuestra cadena de texto sería leída realmente desde la posición 0 a 1).

  Ese dato leído lo guardamos en la variable $day, y ahora validaremos que ese día sea correcto de la siguiente manera:

 if(strlen(trim($day)) < 2)

      {

      

        if(strlen(trim($day)) == 0)

          return "00";

        else

          return "0".trim($day);

          

      }

      else

        return trim($day);

  Si el tamaño del dato a analizar (el día) es menor a dos le anexaremos al inicio el número "0" para siempre tener el día comenzando con "0", por ejemplo 01, 02, etc. Pero para ello debemos saber cuantos ceros hay que anexarle, es por ello que verificamos si la longitud de nuestra cadena es cero, entonces tenemos una fecha inválida y retornamos "00", si la longitud es "1", entonces solo le anexamos un "0" al inicio, pero si sí tiene la longitud requerida entonces simplemente retornamos el día recuperado.

  La funcionalidad es la misma para el resto de las funciones, solo va cambiando la posición de donde queremos comenzar a leer dependiendo de si es el día, el mes, el año, hora, minuto o segundo a recuperar:

  Las posiciones 0-2 corresponden al día, 3-2 al mes (recuerden, extraeremos el dato a partir de la posición 3, pero 2 solo indica el tamaño del dato a analizar, no su posición, substr, la función que extrae los datos solo necesita que le indiquemos una variable de donde extraerá la información, donde comenzaremos y cuantos caracteres queremos leer), 6-4 para extraer el año (aquí es la única excepción al validar, el año debe tener 4 dígitos de longitud, si no los tiene iremos revisando cuantos ceros faltan y se los iremos anexando hasta tener el formato correcto y retornarlo.

Ahora solo resto poner a prueba estas funciones. Para ello crearemos una fecha de prueba, extraeremos todos los datos que la componen y luego reconstruiremos la fecha a partir de esos datos y los dos deben ser iguales.

$str = "07/06/2019 18:59:27";


$day = getdayfromdate($str);

$month = getmonthfromdate($str);

$year = getyearfromdate($str);

$hours = gethoursfromdate($str);

$minutes = getminutesfromdate($str);

$seconds = getsecondsfromdate($str);


$newstr = $day."/".$month."/".$year." ".$hours.":".$minutes.":".$seconds;


echo "Fecha inicial: ".$str."<br><br>";

echo "D&iacute;a: ".$day."<br>";

echo "Mes: ".$month."<br>";

echo "A&ntilde;o: ".$year."<br>";

echo "Hora: ".$hours."<br>";

echo "Minutos: ".$minutes."<br>";

echo "Segundos: ".$seconds."<br><br>";


echo "Fecha reconstruida: ".$newstr;

Este es el resultado al correr nuestro script PHP desde nuestro servidor:

  Como podemos ver, los datos extraídos corresponden a la fecha que hemos proporcionado y al reconstruir la fecha a partir de esos datos obtenemos la fecha original.

Conclusiones:

  Reutilizar código fuente dentro del mundo de la programación es considerado una buena práctica, porque nos permite agilizar los tiempos de desarrollo de aplicaciones, también, si hubiera mejoras o corrección de errores en una función, solo tendríamos que modificar el archivo que estamos enlazando y el resto de las aplicaciones que lo usan se beneficiarían al no tener que volver a codificar nada (esto aplica para lenguajes interpretados - como PHP, en aplicaciones ejecutables debemos recompilar el programa). Estas funciones aprovechan el trabajo de las funciones liberadas en un post anterior y nos permiten hacer más cosas con menos tiempo pues delegan parte del trabajo a algo que ya existe y funciona, ahorrándonos tiempo y esfuerzo.

Sort:  

Congratulations @marjuanm! You have completed the following achievement on the Steem blockchain and have been rewarded with new badge(s) :

You made more than 100 comments. Your next target is to reach 200 comments.
You got more than 50 replies. Your next target is to reach 100 replies.

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!

Do not miss the last post from @steemitboard:

SteemitBoard - Witness Update
Do not miss the coming Rocky Mountain Steem Meetup and get a new community badge!

You can upvote this notification to help all Steem users. Learn how here!

Coin Marketplace

STEEM 0.17
TRX 0.24
JST 0.034
BTC 95730.82
ETH 2731.31
SBD 0.68