Aplicar formato a una fecha.

Resumen.

Si existe algo que siempre estará presente en cualquier sitio Web sea del género que sea, es la fecha. Ya sea para emitir una factura, ya sea para conocer la evolución del trafico de nuestro sitio Web, o para hacer publica una oferta de un determinado producto, con la fecha trataremos todos los días y puede tener diferentes formatos, a esto nos referiremos en este artículo.

Artículo.

Sobre la fecha podemos decir muchas cosas, pero en este artículo nos vamos a centrar en la forma en que se muestra las fechas en las diferentes partes de un sitio Web, tengamos en cuenta que si bien la fecha es una, podemos expresarla como dd-mm-aaaa, aa-mm-dd, mm-dd-aa...; las formas son muchísimas. Incluso a veces solo nos interesa filtrar por un día concreto o un mes concreto o un año. A esto cabe añadir que se suelen usar como separadores tanto el (-) guión central como la barra de división (/). Pero no se queda aquí, a veces también queremos mostrar la hora, por que no nos vasta con saber que un usuario se registro un cierto día, también queremos saber a que hora nuestro sitio Web tiene mayor trafico.

Si bien el manejo de una cadena como es la fecha la podemos manipular fácilmente con la función nativa substr(), esto puede hacerse un tanto laborioso dado que esta función puede recibir hasta 3 parámetros.

Con la idea de facilitar esta labor se desarrollo hace mucho tiempo una función para facilitar estas tareas tan frecuentes y recurrentes.

Un detalle importante a tener en cuenta con la función que os vamos a presentar es que parte de que el año sea expresado con 4 dígitos, de esta forma podemos reconocer si la fecha esta expresada como aaaa-mm-dd o como dd-mm-aaaa. La lógica es sencilla, si extrayendo los 4 primeros caracteres existe un guión (-) o barra de división (/), el primero que aparece es el día, en caso contrario, aparece primero el año.

A partir de aquí, siguiendo una lógica de validación mediante la función preg_replace() podemos también determinar si existe una hora en función de si en la cadena existen o no dos puntos (:), ya que es el separador entre horas y minutos (ej: 18:34).

Con las estructuras condicionales (else) montadas, realizamos mediante la función substr() el movimiento de los datos de una parte a otro de la cadena para que tome la forma deseada, recogiendo por separado el año, mes, día y hora en variables independientes y luego recolocando estas variables en función de nuestra necesidad.

Dado que queremos presentar diferentes formas de fecha, las que para nosotros sean mas útiles, el return de la función debe devolver varios valores, y como sabemos, en una función solo puede haber un return. Para ello el return de la función debe enviar una variable tipo array.

Con todo esto, de una determinada fecha, por ejemplo 2022-12-05 13:18 podemos sacar fechas en los siguientes formatos:
Array ( [0] => 05-12-2022 13:18 [1] => 05 [2] => 12 [3] => 2022 [4] => 13:18 [5] => 05-12-2022 13:18 [6] => 2022-12-05 13:18 [7] => 05-12-2022 [8] => 2022-12-05 )
Dicho esto, aquí os dejo la función.

<?php // Aplica formato a una fecha que incluye hora function Forma_Fecha($For_fecha){ $Formato_Fecha = substr($For_fecha, 0,3); $Ncatr_Fecha = strlen($For_fecha); $exp_rgl = "/[[:digit:]]|[: ]/"; // Reconoce digitos : y espacios en blanco para eliminarlos, asi queda solo el separador $f_Sep = substr(preg_replace($exp_rgl, '', $For_fecha), 0,1); // Separador que usamos para la fecha if(@stristr($Formato_Fecha, $f_Sep) === FALSE) { // Si NO hay guion en los tres primeros caractares, aparece primero el año $f_Fecha = substr($For_fecha, 0,10); // Extraemos la fecha if($Ncatr_Fecha > 12){ // Extraemos la hora <<< // Viene hora con la fecha $f_Hora = substr($For_fecha, -5); } else { // NO viene hora con la fecha $f_Hora = null; } $f_Anio = substr($f_Fecha, 0, -6); // Extraemos año <<< $f_Mes = substr($f_Fecha, -5, 2); // Extraemos el mes <<< $f_Dia = substr($f_Fecha, -2); // Extraemos el dia <<< $F_dmah = "$f_Dia$f_Sep$f_Mes$f_Sep$f_Anio <small>gt;$f_Hora</small>"; $F_amdh = "$f_Anio$f_Sep$f_Mes$f_Sep$f_Dia <small>$f_Hora</small>"; $F_dma = "$f_Dia$f_Sep$f_Mes$f_Sep$f_Anio"; $F_amd = "$f_Anio$f_Sep$f_Mes$f_Sep$f_Dia"; $Valores_Fecha = array( 0 => $For_fecha, 1 => $f_Dia, 2 => $f_Mes, 3 => $f_Anio, 4 => $f_Hora, 5 => $F_dmah, 6 => $F_amdh, 7 => $F_dma, 8 => $F_amd ); } else { // Si hay guion en los tres primeros caractares, aparece primero el dia $f_Fecha = substr($For_fecha, 0,10); // Extraemos la fecha if($Ncatr_Fecha > 12){ // Extraemos la hora <<< // Viene hora con la fecha $f_Hora = substr($For_fecha, -5); } else { // NO viene hora con la fecha $f_Hora = null; } $f_Anio = substr($f_Fecha, 6, 4); $f_Mes = substr($f_Fecha, 3, 2); $f_Dia = substr($f_Fecha, 0, 2); $F_dmah = "$f_Dia$f_Sep$f_Mes$f_Sep$f_Anio <small>$f_Hora</small>"; $F_amdh = "$f_Anio$f_Sep$f_Mes$f_Sep$f_Dia <small>$f_Hora</small>"; $F_dma = "$f_Dia$f_Sep$f_Mes$f_Sep$f_Anio"; $F_amd = "$f_Anio$f_Sep$f_Mes$f_Sep$f_Dia"; $Valores_Fecha = array( 0 => $For_fecha, 1 => $f_Dia, 2 => $f_Mes, 3 => $f_Anio, 4 => $f_Hora, 5 => $F_dmah, 6 => $F_amdh, 7 => $F_dma, 8 => $F_amd ); } return $Valores_Fecha; } // Ejecutamos a la funcion $fecha = '05-12-2022 13:18'; $datos_fecha = Forma_Fecha($fecha); echo '<pre>'; print_r($datos_fecha); echo '</pre>'; echo "<b>Fecha original:</b> <i>$datos_fecha[0]</i> <br /> Día: $datos_fecha[1] <br /> Mes: $datos_fecha[2] <br /> Año: $datos_fecha[3] <br /> Hora: $datos_fecha[4] <br /> Fecha dd-mm-aaaa hora: $datos_fecha[5] <br /> Fecha aaaa-mm-dd hora: $datos_fecha[6] <br /> Fecha dd-mm-aaaa: $datos_fecha[7] <br /> Fecha aaaa-mm-dd: $datos_fecha[8]"; ?>

Por ultimo, agregaré un detalle con el que debemos contar siempre, a veces creemos que hemos desarrollado un código perfecto, una función perfecta, pero aunque funcione a la perfección, también es posible que existan otras formas mas sencillas de hacer los mismo, y así lo descubrí mas adelante. Pero esta función es plenamente útil y una vez montada, ¿para que tener dos funciones que hacen lo mismo solo por que otra puede tener una sintaxis un poco mas sencilla?. Dejo a vuestro criterio si es oportuno o no el uso de esta función, y os invito a descubrir esa forma mas simple de realizar esta tarea, podéis considerar esta función como un mero ejemplo didáctico.
Tags: Fecha || formato || Forma_Fecha || substr || preg_replace || hora

Comentarios.

Sin comentarios, publica el tuyo.