Fechas en Español con PHP y setlocale


Que tal queridos lectores hoy es viernes y hoy toca, si hoy toca un pequeño tutorial donde hablare acerca de como poner las fechas en español cuando trabajamos con PHP, existen muchas formas de hacerlo, que si con una función, que con arrays, que set_locale, por mencionar algunas de las muchas formas con las que podemos realizar nuestro objetivo, obviamente todo depende del nivel de conocimiento que se tenga en PHP buscaremos la forma más fácil para nosotros de implementar nuestros scripts.

Empezare a hablar acerca de este tema tomando como entendido que ya tienen conocimiento básico de PHP y de la Función Date, por si tienen sus dudas hace tiempo publique un tip acerca de esta función les recomiendo lo revisen antes de empezar.

Sin más rodeos a codear sea dicho.

Cuando mandamos a imprimir una fecha con PHP aparece en ingles y con el formato de Unix por defecto, nosotros podemos decir que es lo que queremos mostrar y como queremos hacerlo.


<?php
 echo date('l, d M Y');

//Formato de salida: Friday, 24 Feb 2012
 ?>

Partiendo de esto, como logramos poner en español esa fecha, vamos a hacerlo de la manera más facil que es configurar la función setlocale la cual establece la información de la configuración regional y la cual hará todo el trabajo por nosotros. La función setlocale  nos ofrece traducciones de cosas básicas, como la fecha, que suelen venir en el sistema operativo. Veamos como configurar setlocale para el idioma Español:

Algo muy importante para tener en cuenta al momento de trabajar con la función setlocale tambien tenemos que utilizar la función strftime la cual formatea una fecha/hora local según la configuración regional que manejemos con setlocale.

La secuencia estándar para el idioma Español que debería funcionar en cualquier plataforma es:

setlocale(LC_ALL,»es_ES»);

LC_ALL: Es una constante que especifica la categoría de las funciones afectadas por la configuración regional, en este caso toma en cuanta todas las constantes.
es_ES:  Los primeros 2 caracteres identifican al idioma, los 2 últimos al país.

Ejemplo:

<?php
setlocale(LC_ALL,"es_ES");
echo strftime("%A %d de %B del %Y");

//Salida: viernes 24 de febrero del 2012
?>

Listo con esto ya tenemos nuestra fecha en español sin mayor problema, ya nada más es cosa de darle formato, pero eso ya les toca a ustedes XD.

Pero

Qué pasa si nuestro servidor no soporta setlocale :S , bueno para esto una forma fácil de hacerlo es usar arrays.

En este caso podemos hacer la traducción nosotros mismos. Por ejemplo, para el día de la semana haríamos algo así:

<?php

$dias = array("Domingo","Lunes","Martes","Miercoles","Jueves","Viernes","Sábado");
$meses = array("Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre");

echo $dias[date('w')]." ".date('d')." de ".$meses[date('n')-1]. " del ".date('Y') ;
//Salida: Viernes 24 de Febrero del 2012

?>

Explicando un poco el código por si dicen que carajo hizo este tipo, bueno vamos por partes:

Dentro de la variable $dias utilice un array en el que almacene los días de la semana, recordemos que los  array sirven para almacenar, manejar y operar conjuntos de variables.

Al momento de mandar a imprimir en pantalla utilice la función date con el formato ‘w’ que nos devuelve la representación numérica del día de la semana (0 para domingo hasta 6 para sábado).
Para la parte de los meses utilice la misma lógica, pero hay que tomar en cuenta que el formato ‘n’ nos devuelve los números de los meses de 1 hasta 12, entonces esto lo que nos causaría es que se recorrerían los meses una posición, ejemplo si dejamos la $meses[date(‘n’)] lo que nos pondría seria el mes siguiente en lugar de poner el mes actual, ejemplo, si estamos en Febrero pondría Marzo y eso no es lo que queremos, de ahí que se le haya agregado el -1, con esto tenemos resuelta esta parte, si se preguntan por que pasa eso, es por que los arrarys empiezan a contar desde 0 y no desde 1, así como tenemos el arreglo de $meses sería de 0 hasta 11 ahí tendríamos las 12 posiciones.

Bueno espero que les sirva estos tips, cualquier cosa dejen su mensaje y estaré al pendiente para dar respuesta a sus dudas, cabe aclarar que no soy un master o gurú de PHP, todo lo que e aprendido es gracias a tutoriales y naufragando en internet y lo comparto con ustedes que como yo en algún momento nos encontramos aprendiendo cada día algo nuevo.

Saludos

Fechas en Español con PHP y setlocale

73 comentarios en “Fechas en Español con PHP y setlocale

  1. Buenas,

    Llevo poco tiempo programando en php y quiero introducir la fecha en las entradas que escribo en mi web. Ya encontré el mismo código que propones y funciona a la perfección.

    Mi problema sería que cada vez que actualizo el navegador la hora y la fecha se actualizan. He cambiado el «strftime» por «date» pero mí problema persiste.

    Me sabrías decir como hacerlo?

    Gracias….

  2. Hola ya entre a tu página y ya vi cual es el problema, lo que pasa es que en tu página donde muestras la nota, es donde se muestra la fecha del día no la fecha del día que lo publicaste.

    El error se encuentra en que no estas mandando llamar la fecha desde tu BD, por eso es que se te muestra la fecha del día.

    Lo que puedes hacer es copiar el código de la fecha que tienes cuando muestras los resúmenes de las notas en tu pagina inicial y pegarlo en tu página donde muestras la nota completa.

    Saludos

  3. Litzor COL dijo:

    Bro, ¿cómo hago para hacer un echo en español con el nombre abreviado del mes (M) por arrays?
    Ejemplo: echo $meses[date(‘M’)-1]
    Pero no funciona con la M mayúscula. Gracias, saludos

  4. Pablo dijo:

    Hola tengo un problema exploro una fecha con mysql_fetch_array() y me muestra la fecha en una tabla en el formato americano y-m-d pero cuando uso date() me sale 31-12-1969 para todas los registros????.
    Gracias por la ayuda.

  5. David dijo:

    Hola.

    Yo el problema que tengo es que estoy tomando el valor del datetime picker de jQuery y lo pongo con este formato en el inputtext asi: 06/12/2012. (Podría ser así tambien: 06-12-2012)

    Luego necesito insertarlo en la base de datos y con este formato: 2012-12-06, pero no logro cambiarlo ni con setlocale ni con nada.

    Alguna sugerencia?
    Gracias

  6. Hola si lo tengo en una variabel asi
    $dated = date(«Y-m-d H:i:s»); // server date/time

    ¿como lo cambio para poder poner el setlocale?

    Es un script que tengo de comentarios y la fecha le he encontrado debe ir en esa linea

  7. Déjenme darles un consejo 😛

    Yo uso este código y me va al 10+

    Para insertar una fecha de edición o creación de un post recomiendo usar time() esto te devuelve un valor similar a «1372875879» eso es un timestamp, es bastante efectivo xD

    Ahí ustedes lo insertan en su consulta :3 y lo reciben con algo como esto

    y eso me devuelve: 03-07-2013 a las 14:24:39 luego lo complementan con los datos de los arrays y listo :3

  8. Gran aporte, aveces se olvidan estas cosas. Para los que tienen problemas con el UTF-8 les dejo el siguiente código:

    Este ejemplo es para WordPress, si lo quieren usar en PHP puro, cambian la función get_the_date() por date()

    Saludos!

  9. Gran aporte, aveces se olvidan estas cosas. Para los que tienen problemas con el UTF-8 les dejo el siguiente código:

    setlocale(LC_ALL,»es_ES»);
    $fecha = utf8_encode(strftime(«%A %d de %B, %Y»,strtotime(get_the_date())));
    echo $fecha;

    Este ejemplo es para WordPress, si lo quieren usar en PHP puro, cambian la función get_the_date() por date()

    Saludos!

  10. el teme dijo:

    Excelente dato, sólo dejaré un tip, quizá a algunos les sirva; para no hacer el array de nombres de días y meses, pueden probar escribiendo:
    setlocale(LC_ALL,»esp»);
    en vez de:
    setlocale(LC_ALL,»es_ES»);
    A mi me funcionó, saludos.

  11. Gracias por tu colaboración … y por las molestias que te tomas en dar algo de luz a los que no sabemos 😉
    Yo llevo toda la mañana buscando cómo pasar un dato de timestamp de mi BD [de una noticia creada] a fecha en español para imprimirla en frontend.
    No sé programar en PHP por lo que lo que voy cogiendo de un sitio y de otro no sé ensamblarlo y me desespero.
    ¿Podrías darme alguna pista? …
    Gracias!!

  12. David dijo:

    Hola.

    Yo lo que quiero es a partir de una fecha que tengo en la base de datos;
    año: 1998
    mes: 4
    día: 25

    Mostrar un texto como este:
    Sábado 25 de Abril de 1998

    Similar a este resultado:
    strftime(«%A, %d de %B de %Y»)

    Gracias.

  13. Los Educadores dijo:

    Mira, si tienes que usar datetime, puedes hacerlo así:
    $fecha = $dateConsulta->format(‘d-M-Y’);
    $fecha = str_replace(‘Jan’,’Ene’,$fecha);
    $fecha = str_replace(‘Apr’,’Abr’,$fecha);
    $fecha = str_replace(‘Aug’,’Ago’,$fecha);
    $fecha = str_replace(‘Dec’,’Dic’,$fecha);

    Esa fue la solución q encontré después de varias horas de buscar y que nada me funcionara

    1. jair dijo:

      Tengo unas fechas estipulada en en el desarrollo pero el mes me sale en inglés. He utilizado setlocale(LC_TIME, ‘es_ES’); pero no lo soporta, he intentado con array pero me toma es la fecha actual, y lo que quiero es traducir las fechas estipulada.

  14. la chica dijo:

    amigos utilice el codigo:

    y ahora como lo paso a otro documento.php para guardar en base de datos?

    Estoy haciendo formularios y quiero guardar la fecha en la que fue llenado por el usuario

    agradeceria su ayuda 🙂

  15. la chica dijo:

    el de arrays:

    $dias = array(«Domingo»,»Lunes»,»Martes»,»Miercoles»,»Jueves»,»Viernes»,»Sábado»);
    $meses = array(«Enero»,»Febrero»,»Marzo»,»Abril»,»Mayo»,»Junio»,»Julio»,»Agosto»,»Septiembre»,»Octubre»,»Noviembre»,»Diciembre»);

    echo $dias[date(‘w’)].» «.date(‘d’).» de «.$meses[date(‘n’)-1]. » del «.date(‘Y’) ;

  16. http://php.net/manual/en/timezones.php
    $dias = array(«Domingo»,»Lunes»,»Martes»,»Miercoles»,»Jueves»,»Viernes»,»Sábado»);
    $meses = array(«Enero»,»Febrero»,»Marzo»,»Abril»,»Mayo»,»Junio»,»Julio»,»Agosto»,»Septiembre»,»Octubre»,»Noviembre»,»Diciembre»);
    echo $dias[date(‘w’)].», «.date(‘d’).» de «.$meses[date(‘n’)-1]. » del «.date(‘Y’).» «.date(«H:i»);
    //Salida: Martes, 02 de Junio del 2015 23:44
    ?>

  17. tengo una aplicacion en windows 7 con IIS, PHP y Mysql y Java scrypt el problema que tengo es que migre la aplicacion a una maquina con windows 10 y instale xampp, ahora las paginas en el explorador de chrome me despliega la fecha con un dia despues, es decir si hoy es 6/21/2016 me despliega 22-jun-2016 el codigo que tengo es el siguiente:

    echo «Usuario: «.$_user->first_name.» «.$_user->last_name.» –
    Fecha: «.date(«d M Y»).» «; ?>

  18. buenas para los que quieren hacerlo con bases de datos o juntarlo solo hagan esto:

    a lado de los que ponen ‘d’ por ejemplo solo agreguen un ,strtotime($con lo que vendría ser lo que atrae la información de la base de datos de la fecha) y listo sierran el paréntesis. bueno eso es todo espero les alla ayudado.

  19. Me sirvio y mejore para formatear una fecha desde bd

    $valido_hasta=$rowp[‘valido_hasta’];
    $newvalido_hasta = $dias[date(‘w’, strtotime($valido_hasta))].» «.date(‘d’, strtotime($valido_hasta)).» de «.$meses[date(‘n’, strtotime($valido_hasta))-1]. » del «.date(‘Y’, strtotime($valido_hasta)) ;

  20. $valido_hasta=$rowp[‘valido_hasta’]; //ejemplo 2018-05-25 o $valido_hasta=»2018-05-25″;
    $newvalido_hasta = $dias[date(‘w’, strtotime($valido_hasta))].” “.date(‘d’, strtotime($valido_hasta)).” de “.$meses[date(‘n’, strtotime($valido_hasta))-1]. ” del “.date(‘Y’, strtotime($valido_hasta)) ;
    echo $newvalido_hasta;
    /*
    devuelve:
    $newvalido_hasta =Viernes 25 de Mayo del 2018
    */

Deja un comentario