ElTicus.com

Programación, lenguajes y recursos para programadores

Recurso no clasificado
Como convertir una fecha de Lenguaje Natural a tipo DATE
Código fuente en PHP
Publicado por jl Fecha: 2007-11-15 23:05:16 Idioma: Español Tipo de documento: Código fuente

Como convertir una fecha de Lenguaje Natural a tipo DATE

Utilizando manejo de cadenas en PHP, se trata de convertir una fecha dada como cadena en formato LongDate al formato admitido por MySQL YYYY-MM-DD.

Comparto este código para aquellos que pudieran tener un problema similar.

Me pasaron una base de datos que contenía un campo fecha, pero dicho campo fecha era en realidad un campo de tipo Texto en donde habían capturado la fecha como una cadena y yo lo necesitaba de tipo Fecha obligatoriamente.

Las fechas originalmente están en el siguiente formato:


Lunes, 10 de Febrero de 2001
Miércoles, 24 de Diciembre de 2006
Jueves, 3 de Agosto de 1998
Martes, 6 de Enero de 2003
...

Procedimiento

En primer lugar hice una revisión de la información verificando que el formato de las fechas es consistente, es decir que no hay errores de ortografía ni variaciones en el formato, todas las fechas cumplen con el formato: DIA[coma] NUMERO[ de ]MES[ de ]AÑO
Lo cual facilitó bastante la conversión ya que si ubiera habido variaciones tendría que uniformarlo primero.


Condiciones iniciales

Tengo una tabla en mi base de datos de nombre DATA1 y entre sus campos se encuentra el ID que es mi Campo Llave y FECHA que es la que tiene las características que mencioné.


<?php

$server = "localhost";
$user = "root";
$pass = "";
$database = "test";

$link = mysql_connect($server,$user,$pass);
mysql_select_db($database,$link) or die(mysql_error());


//Comienzo creando una tabla para ver el resultado en pantalla
echo "<table border=1>"; 

$sql="SELECT id, fecha FROM data1 order by id limit 0,10000";
$query = mysql_query($sql) or die(mysql_error());
while($row = mysql_fetch_array($query))
{
 
 $fechacad=$row[1];
 if("$fechacad"!="") //<-- verifico que el campo fecha no esté vacío
 {
   //Lo paso a mayúsculas para evitar las "altas y bajas"
   $fechacad=strtoupper($fechacad);
   
   //Reemplazo los [Nombres del Mes] por el número correspondiente:   
   $fechacad=str_replace("ENERO",'01',$fechacad);
   $fechacad=str_replace("FEBRERO",'02',$fechacad);
   $fechacad=str_replace("MARZO",'03',$fechacad);
   $fechacad=str_replace("ABRIL",'04',$fechacad);
   $fechacad=str_replace("MAYO",'05',$fechacad);
   $fechacad=str_replace("JUNIO",'06',$fechacad);
   $fechacad=str_replace("JULIO",'07',$fechacad);
   $fechacad=str_replace("AGOSTO",'08',$fechacad);
   $fechacad=str_replace("SEPTIEMBRE",'09',$fechacad);
   $fechacad=str_replace("OCTUBRE",'10',$fechacad);
   $fechacad=str_replace("NOVIEMBRE",'11',$fechacad);
   $fechacad=str_replace("DICIEMBRE",'12',$fechacad);
   
   //Suprimo los nombres del [Nombre del Día] ya que no me resulta relevante:
   $fechacad=str_replace("LUNES, ",'',$fechacad);
   $fechacad=str_replace("MARTES, ",'',$fechacad);
   $fechacad=str_replace("MIERCOLES, ",'',$fechacad);
   $fechacad=str_replace("JUEVES, ",'',$fechacad);
   $fechacad=str_replace("VIERNES, ",'',$fechacad);
   $fechacad=str_replace("SABADO, ",'',$fechacad);
   $fechacad=str_replace("DOMINGO, ",'',$fechacad);
   
   //Suprimo reemplazo los [ de ]'s por diagonales (puede ser cualquier otro caracter):
   $fechacad=str_replace(" DE ",'/',$fechacad);
   
    /*---------------------------------------
     En este momento la fecha ya tiene el formato:
                   21/03/2007
                   
     Lo cual es ya un formato de fecha aceptable 
     en algunos sistemas, pero no en MySQL.
    -----------------------------------------*/

   
   // Con una expresión regular descompongo la fecha en sus elementos
   if(ereg("([0-9]{1,2})/([0-9]{2})/([0-9]{4})",$fechacad,$res))
   {
     /*--------------------------------------
       En este momento la fecha se dividió en:
       $res[1] = 21
       $res[2] = 03
       $res[3] = 2007
       
       Asíq ue simplemente se vuelve a armar la cadena 
       con el acomodo deseado que es: 2007-03-21
     ----------------------------------------*/

     $aux="{$res[3]}-{$res[2]}-{$res[1]}";
     
     // Muestro en pantalla el antes y el después:
     echo "<tr><td> {$row[1]} </td><td> $aux </td></tr>\n";   
     
     /* --------------------------------------
     
     // El siguiente código es para actualizar 
     // la información en la base de datos:
     // (se recomienda omitirlo en las primeras corridas)
     
     $sql2="update data1 set fecha='$aux' where id={$row[0]}";
     mysql_query($sql2) or die("ERROR:". mysql_error());
     
     ----------------------------------------*/

   }
   else
   {
    /* En caso de que el formato de fecha no coincida con 
       el esperado en la expresión regular marcamos el error 
       y detenemos el programa. */
    
    die("<tr><td>  Error con {$row[1]} </td></tr>");
   }
 }   
}

?>

Importante: Puse toda la documentación como comentarios dentro del código fuente, les recomiendo leerlo con cuidado y entenderlo antes de utilizarlo con una base real.

Y como siempre: NO OLVIDEN RESPALDAR PRIMERO.

Después de haber ejecutado el proceso, me metí al PHPMYADMIN y cambié el tipo de dato a Tipo DATE y ya lo pude usar como una fecha estándar.




Nadie ha puesto ningún comentario todavía


Haz un comentario sobre este tema
Nombre email (no se muestra)
comentario:
Escribe las 2 letras que ves aquí: Imagen anti-spam =




No hay comentarios

Artículos relacionados:
Recurso no clasificado Como imprimir la fecha en español utilizando PHP aunque el idioma del servidor sea el inglés. Tip Como corregir la fecha de mi servidor si éste se encuentra en un uso horario diferente al mio Recurso no clasificado Para imprimir la fecha en español utilizando PHP independientemente del lenguaje del servidor (Utilizando ARRAYS)