MySQL, PHP, fechas e idiomas, vaya lio…

Como comenté en el POST anterior, ya hemos lanzado La Porra, pero ahora quiero escribir aquí algunas conclusiones técnicas que he sacado respecto al tema de las diferencias horarias y los idiomas de las fechas tanto en MySQL como en PHP.

El servidor que uso es un Solaris, creo (Joyent me lo dio gratis y configurado), y no sabía como cambiar la hora del sistema ni el idioma. Como no quería andar haciendo pruebas en el servidor de producción y no quería andar reiniciándolo, pensé en cambiar las configuraciones de PHP y MySQL. Aquí os dejo como lo he hecho:


En Bilbao, usamos el uso horario CET ([bilbainada*] y el resto de centro Europa nos copia[/bilbainada]) en invierno y CEST en Verano.
CET: Central European Time (GMT+2) (30 de Marzo – 26 de Octubre)
CEST: Central European Summer Time (GMT+1) (26 de Octubre – 30 de Marzo)
En el listado de usos horarios standar suele llamarse “Europe/Madrid”.

Pues bien, para cambiar el uso horario en PHP, en tiempo de ejecución, podemos hacerlo con date_default_timezone_set:

date_default_timezone_set('CET');//o 'Europe/Madrid', pero yo no lo he conseguido hacer funcionar así, a ver que pasa cuando cambie el uso...

Y para cambiar el idioma en que se escribe la fecha, usamos setlocale:

setlocale(LC_ALL,'es_ES.UTF-8); //es_ES.UTF-8 tiene que estar en el sistema.

Cuando hemos cambiado setlocale, para que nos escriba Martes en vez de Tuesday, tenemos que usar la función strftime():

// %A - nombre completo del día de la semana de acuerdo a la localidad actual
// %B - nombre completo del mes de acuerdo a la localidad actual
// %d - día del mes como un número decimal (rango 01 a 31)
// %g - como %G, pero sin la centuria.
// %G - El año de 4-dígitos correspondiente al número de semana ISO (vea %V). Éste tiene el mismo formato y valor que %Y, con la excepción de que si el número de semana ISO pertenece al año siguiente o previo, ese año es usado en su lugar.
// %H - hora como un número decimal usando un reloj de 24 horas (rango 00 a 23)
// %I - hora como número decimal usando un reloj de 12 horas (rango 01 a 12)
// %j - dúa del año como un número decimal (rango 001 a 366)
// %m - mes como un número decimal (rango 01 a 12)
// %M - minuto como un número decimal
// %S - segundo como un número decimal
// %u - día de la semana como un número decimal [1,7], en donde 1 representa Lunes
// 'l, d de F H:i'  ==>  '%A, %d de %B %H:%M'
echo strftime('%A, %d de %B %H:%M',$tiempo); //donde tiempo es un UNIX-TIMESTAMP
// Escribirá: sábado, 30 de agosto 14:45

Con eso, ya he podido ver la fecha-hora que aparece en pantalla en castellano, además de que la hora actual esté en la hora de aquí. Pero si en MySQL hago “now()” me sigue saliendo la hora del sistema. Para cambiar eso:

SET GLOBAL time_zone = 'Europe/Madrid';

(Puede que haya que reiniciar MySQL, o por lo menos salir y entrar de nuevo) Para ver si lo hemos cambiado bien:

SELECT @@global.time_zone, @@session.time_zone;

Donde pongo “Europe/Madrid”, se pueden poner otros time-zones cargados en Mysql.
Cuando yo hice esto, no funcionó a la primera porque MySQL no tenía cargados los timezones, por lo que tuve que cargarlos desde el sistema, con un comando de MSQL:

mysql_tzinfo_to_sql "directorio_de_tz" | mysql -u root -p mysql

[“directorio_de_tz” en mi caso era: “/usr/share/lib/zoneinfo”]
Mas información sobre MySQL y este tema en la documentación de MySQL (9.7. MySQL Server Time Zone Support).


¿conocéis otra manera de hacer esto? ¿tendré problemas más adelante? ¿que pasará cuando cambie el horario de verano? Iré actualizando este POST, tranquilos…

Una bilbainada, a parte de un género musical, es cualquier frase/acción ligeramente exagerada que sólo puede decir/hacer uno de Bilbao. Por ejemplo: Guggenheim Bilbao, Metro Bilbao, Una auténtica Bilbainada, Bilbainadas o no, Y no es una bilbainada y Bilbainada Gastronómica.

3 opiniones en “MySQL, PHP, fechas e idiomas, vaya lio…”

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *