Portada | Monotemáticos | Secciones | Desarrolladores | Comunidad | Servicios | Servicios profesionales
Desde 0 | HTML | CSS | ASP | PHP | AJAX | Javascript | Promoción de webs | Rentabilidad de webs
Directorio | Manuales | Scripts | FAQs | Programas | Artículos Copyleft | Actualidad | La Cosecha | Colabora
Registrarse | Vuestras páginas | Foros del web | Lista de correo | Boletín de novedades
Generador METAs | Compras | Busca cursos
Alojamiento | Dominios.es | Micropagos SMS | Buscadores | Patentes, marcas | Creación web | Multimedia | Videos
Desarrollo Freelance | Buscar proyectos | Buscar profesionales | Solicitar desarrollo

Convertir fechas entre MySQL y castellano, en PHP


Un par de funciones que nos permitirán convertir las fechas entre el idioma castellano y el formato MySQL, útiles en el trabajo con fechas en PHP.


Las fechas son uno de esos típicos asuntos que pueden hacer que nos rompamos la cabeza a la hora de programar una página. Razón de ello es que tienen distintos formatos dependiendo del país, del lenguaje de programación o de la base de datos que estemos utilizando.

Cuando utilizamos la tecnología PHP solemos trabajar con la base de datos MySQL. En estos dos sistemas los formatos de fechas cambian sensiblemente, así que 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, si trabajamos con MySQL deberemos expresar la fecha 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.

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.

////////////////////////////////////////////////////
//Convierte fecha de mysql a normal
////////////////////////////////////////////////////
function cambiaf_a_normal($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 normal 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;
}


Las funciones utilizan expresiones regulares que no hemos visto todavía, así que no vamos a tratar de explicar cómo funcionan, sino que explicaremos cómo utilizarlas.

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. Además, colocamos la fecha en un campo de formulario.

<input type="text" name="fecha" value="<?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 habremos 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')");

 Seguir navegando a partir aquí:
+ 1 manual relacionado
+ 2 categorias relacionadas
+ 11 comentarios (Añadir)
+ 24 comentarios no revisados

 Autoría, licencia y acciones sobre este artículo

Informe de Miguel Angel Alvarez*
Director de DesarrolloWeb.com

Atención: Contenido exclusivo de DesarrolloWeb.com. No reproducir. Copyright.

* Para consultas técnicas utilizar la lista de correo.

Versión imprimible Versión imprimible del artículo
Enviar artículo por e-mail Enviar artículo por e-mail
Añadir un comentario al artículo Publicar un comentario del artículo

Manuales relacionados con este artículo
Dentro de Taller de PHP
Anterior: Template Power

Categorias relacionadas
A través de las categorías de nuestro directorio se pueden encontrar otro tipo de recursos relacionados con este artículo:
+ Entrar en MySQL
+ Entrar en Scripts en PHP


 Comentarios de los visitantes
Los comentarios de los visitantes son para ampliar la información del artículo. Cualquiera puede participar.
Se muestran 11 comentarios revisados

 Comentario de curro
03/11/03 
yo uso estas otras, más simples. Además, la segunda nos deja la fecha en el formato local...

function DateToQuotedMySQLDate($Fecha)
{
if ($Fecha<>""){
   $trozos=explode("/",$Fecha,3);
   return "'".$trozos[2]."-".$trozos[1]."-".$trozos[0]."'"; }
else
   {return "NULL";}
}

function MySQLDateToDate($MySQLFecha)
{
if (($MySQLFecha == "") or ($MySQLFecha == "0000-00-00") )
    {return "";}
else
    {return date("d/m/Y",strtotime($MySQLFecha));}
}

 Comentario de Mario
16/11/03 
Bueno, quizas mi suloción es un tanto larga o tecnicamente no es correcta... pero el caso es que a mi me funciona y como estoy empezando con el php pues me conformo. Alguno se reirá cuando lo vea pero espero que a otros le sea de utilidad. Un saludo

<?php
// traducefecha.php
// 14 de Octubre de 2003
// Traduce una fecha en formato mm/dd/yyy a formato texto en castellano
// Desde la pagina llamaremos a la funcion
// include("traducefecha.php");
// echo traducefecha("11/15/2003"); Visualiza la fecha
// Donde la fecha ponemos la variable que queremos traducir en formato mm/dd/yyyy
//
function traducefecha($fecha)
    {
    $fecha= strtotime($fecha); // convierte la fecha de formato mm/dd/yyyy a marca de tiempo
    $diasemana=date("w", $fecha);// optiene el número del dia de la semana. El 0 es domingo
       switch ($diasemana)
       {
       case "0":
          $diasemana="Domingo";
          break;
       case "1":
          $diasemana="Lunes";
          break;
       case "2":
          $diasemana="Martes";
          break;
       case "3":
          $diasemana="Miércoles";
          break;
       case "4":
          $diasemana="Jueves";
          break;
       case "5":
          $diasemana="Viernes";
          break;
       case "6":
          $diasemana="Sábado";
          break;
       }
    $dia=date("d",$fecha); // día del mes en número
    $mes=date("m",$fecha); // número del mes de 01 a 12
       switch($mes)
       {
       case "01":
          $mes="Enero";
          break;
       case "02":
          $mes="Febrero";
          break;
       case "03":
          $mes="Marzo";
          break;
       case "04":
          $mes="Abril";
          break;
       case "05":
          $mes="Mayo";
          break;
       case "06":
          $mes="Junio";
          break;
       case "07":
          $mes="Julio";
          break;
       case "08":
          $mes="Agosto";
          break;
       case "09":
          $mes="Septiembre";
          break;
       case "10":
          $mes="Octubre";
          break;
       case "11":
          $mes="Noviembre";
          break;
       case "12":
          $mes="Diciembre";
          break;
       }
    $ano=date("Y",$fecha); // optenemos el año en formato 4 digitos
    $fecha= $diasemana.", ".$dia." de ".$mes." de ".$ano; // unimos el resultado en una unica cadena
    return $fecha; //enviamos la fecha al programa
    }
?>

 Comentario de Versae
19/1/04 
//Yo tb me encontré con ese problema pero simplemente les doy la vuelte a las fechas:

function daterev($date)
{
    if (empty($date))
       return "";
    else
    {
       $date = strtr($date,"/","-");
       $i = 0;
       $tmp = strtok($date,"-");
       while ($tmp)
       {
          $dateok[$i] = "$tmp";
          $i++;
          $tmp = strtok("-");
       }
       return ($dateok[2]."-".$dateok[1]."-".$dateok[0]);
    }
}

//Además para comparar uso la siguiente función

function datecmp($f1, $f2)
{
    $anyo1=(int)substr($f1,1,4);
    $anyo2=(int)substr($f2,1,4);
    if ($anyo1==$anyo2)
    {
       $mes1=(int)substr($f1,6,2);
       $mes2=(int)substr($f2,6,2);
       if ($mes1==$mes2)
       {
          $dia1=(int)substr($f1,9,2);
          $dia2=(int)substr($f2,9,2);
          if ($dia1==$dia2)
             return 0;
          elseif ($dia1>$dia2)
             return 1;
          else
             return -1;
       }
       elseif ($mes1>$mes2)
          return 1;
       else
          return -1;
    }
    elseif ($anyo1>$anyo2)
       return 1;
    else
       return -1;
}

//Devuelve 0 si son iguales, -1 si la primera es menor y 1 si la primera es mayor


 Comentario de derkeNuke
13/4/04 
Hay maneras de ahorrarte tanto codigo:

switch ($diasemana)
{
case "0":
    $diasemana="Domingo";
    break;
case "1":
    $diasemana="Lunes";
    break;
case "2":
    $diasemana="Martes";
    break;
case "3":
    $diasemana="Miércoles";
    break;
case "4":
    $diasemana="Jueves";
    break;
case "5":
    $diasemana="Viernes";
    break;
case "6":
    $diasemana="Sábado";
    break;
}

sería lo mismo que crear un array asi:

$diasemanales=["Domingo","Lunes","Martes","Miercoles","Jueves","Viernes","Sábado"];

Y sustituir todo el switch ese con:

$diasemana=$diasemanales[$diasemana];

PD: Con los meses se puede hacer lo mismo, espero que les interese.


 Comentario de lym
12/6/04 
El único sitio de la red donde se explica con claridad. Funciona perfectamente, gracias. Sólo comentar que si a alguien no le gustan las barras diagonales para separar la fecha, que cambie en la función dichas barras por guiones, por ejemplo. Parece obvio pero ya me lo había preguntado algún amiguete y por si alguien tenía esa misma duda ahí queda dicho.

 Comentario de toni123
26/8/04 
Yo tambien me encontre con el problema de las fechas, sobre todo el tema de que las funciones te la devuelven en 'ingles' asique use lo siguiente, facil, rapido , util y practico....

si tenemos:

$hoy=strftime("%A, %d %B %Y);
echo $hoy;

nos pondra la fecha en ingles, ejemplo:

monday, 12 january 2004

asi que yo puse:

setlocale(LC_TIME,"spanish");
$hoy=strftime("%A, %d de %B de %Y);
echo $hoy;

y esto nos lo traslada al castellano
Lunes, 12 enero 2004

ahora lo siguiente y si tenemos ya la fecha almacenada en formato texto?? por ejemplo:

$hoy="monday, 12 january 2004";

como lo 'traducimos'?
yo puse lo siguiente:

$hoy=str_replace("Monday","Lunes",$hoy);
$hoy=str_replace("Tuesday","Martes",$hoy);
$hoy=str_replace("Wednesday","Miercoles",$hoy);
$hoy=str_replace("Thursday","Jueves",$hoy);
$hoy=str_replace("Friday","Viernes",$hoy);
$hoy=str_replace("Saturday","Sabado",$hoy);
$hoy=str_replace("Sunday","Domingo",$hoy);
$hoy=str_replace("January","Enero",$hoy);
$hoy=str_replace("February","Febrero",$hoy);
$hoy=str_replace("March","Marzo",$hoy);
$hoy=str_replace("April","Abril",$hoy);
$hoy=str_replace("May","Mayo",$hoy);
$hoy=str_replace("June","Junio",$hoy);
$hoy=str_replace("July","Julio",$hoy);
$hoy=str_replace("August","Agosto",$hoy);
$hoy=str_replace("September","Septiembre",$hoy);
$hoy=str_replace("October","Octubre",$hoy);
$hoy=str_replace("November","Noviembre",$hoy);
$hoy=str_replace("December","Diciembre",$hoy);
echo $hoy;

simplemente hacemos un reemplace sin miramientos.... todo lo que sea monday lo cambiamos por lunes, etc etc etc y lo mismo con los meses todo lo que sea january por enero, february por febrero etc etc etc...

lo dicho... rapido, util y practico...

Espero que la idea le sirva a alguien... (aunke posiblemente halla mil formas mas y mejores de hacerlo....)

Toni123

 Comentario de androver
25/9/04 
Correcion: Los sub strings de la funcion anterior estaban mal, provocando el mal funcionamiento de la misma... aqui los nuevos valores (con echos para confirmar que segmenta bien las fechas)

function datecmp($f1, $f2)
{
    $anyo1=(int)substr($f1,0,4);
    $anyo2=(int)substr($f2,0,4);
    echo "año 1: ".$anyo1." --- año 2: ".$anyo2;
    if ($anyo1==$anyo2)
    {
       $mes1=(int)substr($f1,5,2);
       $mes2=(int)substr($f2,5,2);
       echo "mes 1: ".$mes1." --- mes2: ".$mes2;
       if ($mes1==$mes2)
       {
          $dia1=(int)substr($f1,8,2);
          $dia2=(int)substr($f2,8,2);
          echo "dia1 1: ".$dia1." --- dia2: ".$dia2;
          if ($dia1==$dia2)
             return 0;
          elseif ($dia1>$dia2)
             return 1;
          else
             return -1;
       }
       elseif ($mes1>$mes2)
          return 1;
       else
          return -1;
       }
    elseif ($anyo1>$anyo2)
       return 1;
    else
       return -1;
}


 Comentario de patoxs
12/1/05 
No se pero para el cambio de fecha tuve cualquier problema aqui va mi solcion bastante sencilla

$fecha=$_POST['fecha']
$fch=explode("/",$fecha);
$fecha=$fch[2]."-".$fch[1]."-".$fch[0];

para pasar a a mysql
INSERT INTO tabla VALUES ('campo1','$fecha','campo2')

eso seria

 Comentario de Esteban
07/4/05 
Hola, yo utilizo esta función para convertir fechas.

Saludos

STV

function f_datef($date)
{
# ==========================================================
# ==== Recibe una fecha con formato aaaa-mm-dd hh:mm:ss ====
# ==== Devuelve una fecha con formato dd-mm-aa ====
# ==========================================================

$year=substr($date,0,4);
$month=substr($date,5,2);
$day=substr($date,8,2);
$date=$day."-".$month."-".$year;

return ($date);
}

 Comentario de Caronte
19/5/05 
Me ha parecido interesante el artículo. Está claro que he de aprender a usar expresiones regulares porque son muy potentes.

Pero en este caso creo que se puede resolver el paso de MySQL a español y de español a MySQL en una única sentencia:

$sFechaNormal = implode( '/', array_reverse( explode( '-', $sFechaMySQL ) ) ) ;

$sFechaMySQL = implode( '/', array_reverse( explode( '-', $sFechaNormal ) ) ) ;

Con explode hago el trabajo de las expresiones regulares y con array_reverse e implode el trabajo de concatenación de las funciones.

Hacer una función genérica que cambiara unos símbolos por otros y le diera la vuelta sería tan fácil como esto:

function cambiarFecha( $sFecha, $sSimboloInicial, $sSimboloFinal )
{
return implode( $sSimboloFinal, array_reverse( explode( $sSimboloInicial, $sFecha ) ) ) ;
}

De esta manera, si quisiéramos una fecha de MySQL en formato dd/mm/yyyy tenndríamos que llamarla así:

$sFechaNormalConBarra = cambiarFecha( $sFechaMySQL, '-', '/' ) ;

Si quisiéramos otro tipo de separador con sustituir la barra (/) por ese separador suficiente:

$sFechaNormalConMenos = cambiarFecha( $sFechaMySQL, '-', '-' ) ;

La variable $sFechaNormalConMenos guarda ahora la fecha de MySQL con el formato dd-mm-yyyy.

Lo mismo para guardarlo en MySQL :

$sFechaMySQL = cambiarFecha( $sFechaNormalConBarra, '/', '-' ) ;

Lo único que hay que tener en cuenta es saber cuál es el separador con el que viene la fecha. En este caso $sFechaNormalConBarra venía con la barra (/).

Espero que esto le haya servido a alguien a ahorrarse unas cuantas líneas de código.

Un saludo.

 Comentario de Erika
18/10/05 
yo lo hago de esta manera:

function fecha($fecha)
{
    if ($fecha)
   {
      $f=split("-",$fecha);
      $nummes=(int)$f[1];
      $mes1="0-Enero-Febre-Marzo-Abril-Mayo-Junio-Julio-Agosto-Septiembre-Octubre-Noviembre-Diciembre";
      $mes1=split("-",$mes1);
      $desfecha="$f[2] de $mes1[$nummes] del $f[0]";
      return $desfecha;
   }


recibo la fecha por ejemplo 2005-10-18 y la retorna 10 de Octubre del 2005.
Espero que le ayude en algo

Añadir un comentario al artículo Añadir un comentario del artículo
 Comentarios sin revisar
Entre los comentarios no revisados puede haber algunos interesantes que se hayan enviado recientemente.
 Se han encontrado 24 comentarios sin revisar

Ver el comentario no revisadoVer los comentarios no revisados
Añadir un comentario al artículo Añadir un comentario del artículo



Enlaces:
Maestrosdelweb
  Ir arriba

Manuales relacionados
+Taller de PHP
Categorías
+MySQL
+Scripts en PHP

Lectura recomendada

Compra este libro en Agapea, la librería urgente a domicilio.

Tienda DesarrolloWeb

DesarrolloWeb.com | Copyright | Anunciese | Acerca de | Datos legales | Contacta | Por GuiarteMultimedia