> Manuales > Taller de PHP

Funciones PHP para la conversión de fechas entre los formatos de MySQL (YYYY-MM-DD) y en idioma español (DD/MM/YYY). Cómo cargar una fecha en MySQL en un campo DATE que tenemos cargada en formato español.

Las fechas son uno de esos típicos asuntos que pueden hacer que nos rompamos la cabeza a la hora de programar, debido a que existen diversos formatos válidos para idiomas distintos, así como sistemas donde as deseamos cargar. Dependiendo del país, del lenguaje de programación o de la base de datos tenemos que usar las fechas de una manera o de otra.

Un caso común que seguro todos tendremos que solucionar cuando trabajamos haciendo sitios en español es el que vamos a abordar en este artículo. En español solemos usar un formato dd/mm/aaaa y cuando utilizamos la tecnología PHP solemos trabajar con la base de datos MySQL, que tiene un formato yyyy-mm-dd. Dado que en estos dos sistemas los formatos de fechas cambian sensiblemente, será muy interesante conocer una manera rápida de pasar de un formato de fecha a otro, dependiendo de dónde vamos a utilizar esa fecha. Pues, cuando enviemos una fecha a MySQL, debemos expresarla de una manera distinta a la que lo haríamos a la hora de mostrarla en la página para que la entienda fácilmente un lector hispano.

En muchos casos, debemos vérnoslas entre dos tipos de formatos distintos, aunque podría ser peor. Por ejemplo, si la página estuviese en varios idiomas, sería importante escribir correctamente las fechas en cada uno de los idiomas.

Convertir fechas entre español y MySQL y entre MySQL y español

Dejando temas relacionados con el idioma aparte -concentrándonos tan sólo en el Español-, en nuestras páginas programadas en PHP y con base de datos MySQL, tendremos que trabajar con dos formatos. Por un lado tenemos las fechas en castellano, que tienen el formato dd/mm/aaaa y por otro lado tenemos el formato de MySQL, que tiene la sintaxis aaaa-mm-dd.

Lo más cómodo, tal como vemos nosotros este problema, es crear un par de funciones que conviertan las fechas de un formato a otro. Habrá una función que convertirá la fecha de MySQL a Castellano y otra que lo convierta de Castellano a MySQL.

Funciones de cambio de formato de fechas para PHP 7

Esta función la puedes usar para convertir tu fecha en formato MySQL a formato español o castellano.

////////////////////////////////////////////////////
// Convierte fecha de mysql a español
////////////////////////////////////////////////////
function cambiaf_a_espanol($fecha){
    preg_match( '/([0-9]{2,4})-([0-9]{1,2})-([0-9]{1,2})/', $fecha, $mifecha);
    $lafecha=$mifecha[3]."/".$mifecha[2]."/".$mifecha[1];
    return $lafecha;
}

Ahora puedes ver una función que haría la conversión justamente en sentido inverso, una fecha que tienes en español la pasaría al formato de los campos date de MySQL.

////////////////////////////////////////////////////
// Convierte fecha de español a mysql
////////////////////////////////////////////////////
function cambiarFormatoAMysql($fecha){
    preg_match( '/([0-9]{1,2})\/([0-9]{1,2})\/([0-9]{2,4})/', $fecha, $mifecha);
    $lafecha=$mifecha[3]."-".$mifecha[2]."-".$mifecha[1];
    return $lafecha;
}

Las funciones utilizan expresiones regulares, que son herramientas muy potentes aunque algo complejas de explicar. Si deseas un poco más de información sobre cómo funcionan te recomendamos el Manual de Expresiones regulares.

Si no te interesa mucho complicarte con las expresiones regulares aún así puedes usar las funciones cómodamente. Más adelante en este artículo tienes ejemplos sobre cómo utilizarlas.

Funciones de cambio de formato de fechas para PHP 5

Solamente a modo de archivo, dejamos aquí también el código de estas funciones, tal como estaban publicadas anteriormente en este artículo, usando funciones de PHP que existían en PHP 5 pero que han sido retiradas de PHP 7.

////////////////////////////////////////////////////
// Convierte fecha de mysql a español
////////////////////////////////////////////////////
function cambiaf_a_espanol($fecha){
    ereg( "([0-9]{2,4})-([0-9]{1,2})-([0-9]{1,2})", $fecha, $mifecha);
    $lafecha=$mifecha[3]."/".$mifecha[2]."/".$mifecha[1];
    return $lafecha;
}
////////////////////////////////////////////////////
// Convierte fecha de español a mysql
////////////////////////////////////////////////////
function cambiaf_a_mysql($fecha){
    ereg( "([0-9]{1,2})/([0-9]{1,2})/([0-9]{2,4})", $fecha, $mifecha);
    $lafecha=$mifecha[3]."-".$mifecha[2]."-".$mifecha[1];
    return $lafecha;
}

Para entender las diferencias de código ten en cuenta que la función "ereg" fue declarada obsoleta y retirada totalmente en PHP 7. Ahora se tiene que usar la función "preg_match" como hemos visto en los primeros ejemplos compatibles con PHP 7. Sin embargo, "preg_match" ya había sido introducida en PHP 5, por lo que el código propuesto anteriormente para PHP 7 debería funcionar también en PHP 5.

Mostrar en la página una fecha en castellano

Si tenemos una fecha en formato MySQL y deseamos colocarla en una página haremos algo como sigue. Suponemos que la fecha está extrayéndose a través de una consulta a la base de datos y la tenemos en una variable llamada $fila->fecha.

Fecha de la factura: <?echo cambiaf_a_normal($fila->fecha);?>.

Podrías usar esta misma fecha en un campo de formulario. En este codigo colocamos la fecha en un campo input.

<input type="text" name="fecha" value="<?php echo cambiaf_a_normal($fila->fecha); ?>">

Colocar en la base de datos una fecha en formato MySQL

Cuando el usuario nos manda una fecha, por ejemplo, a través de un formulario con un campo como el que acabamos de ver, lógicamente, escribirá la fecha en castellano. Pero nosotros deseamos guardarla en una base de datos en un formato distinto, así que tendremos de convertirla.

Suponemos que tenemos la fecha en una variable llamada $fecha y que está en formato castellano. Además, queremos colocarla en una sentencia SQL que deseamos ejecutar en la base de datos para insertar un registro que contiene, entre otros datos, la fecha que el usuario ha escrito.

mysql_query ("insert into documento (titulo_documento, fecha_documento, cuerpo_documento) values ('$titulo_documento', '" . cambiaf_a_mysql($fecha) . "', '$cuerpo_documento')");
Nota: Solo ten en cuenta que esta manera de montar sentencias SQL no es la más correcta, ya que pueden inyectarte código SQL no deseado. Lo normal es que prepares la sentencia y le bindees los valores de los parámetros. Esto es algo que no voy a tratar en este artículo pero que te recomiendo que estudies.

Otros mecanismos de conversión de fechas en PHP

Este artículo te ha ofrecido dos funciones muy específicas para convertir formatos de fechas muy particulares. Si te interesa ampliar esta información, para hacer conversiones de formatos de manera más general seguro que te vendrá bien conocer la clase DateTime de PHP.

En este artículo podrás aprender a generar y convertir fechas entre múltiples formatos con la clase DateTime de PHP.

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online Escu...

Manual