Normalmente cuando trabajamos con fechas en PHP, nos interesa mostrar la hora o una abreviación de la fecha, y por lo regular no es mayor problema que la fecha se encuentre abreviada en inglés, finalmente la mayoría de los meses coinciden con sus abreviaciones en español (Febrero - February, Marzo - March, Abril - April, Mayo - May, etc.) pero en ocasiones es necesario escribir una fecha traducida a español, y para eso tenemos la función de formateo strftime.
Comencemos con un ejemplo, primero tomemos la función tradicional para imprimr fechas en PHP: date
//formateo mediante date() print date("d M Y, H:i:s");//dia(01-31) Mes(Ene-Dec) Año(AAAA), Hora(0-24):minutos:segundos
La función date tiene varios caracteres de formateo que nos permiten imprimir la información que queremos de la fecha (día, mes, año, semana del año, zona horaria, hora en 24 o 12 hrs, etc.) pero está casada a que los valores textuales como los meses, días de la semana, etc. se muestran en inglés. En el ejemplo anterior, obtendríamos una impresión de la fecha comenzando con el día, seguido por el mes, año y la hora actual. Una característica de la cadena de formato que recibe date es que los contenidos de la cadena se asumen como caracteres formateadores, por lo que si quisieramos escribir, por ejemplo, 25 de Feb del 2004, tendríamos que escapar algunos caracteres como se muestra a continuación:
//primero, definimos el timestamp de la fecha 25/02/2004 $tiempo = '1077732600'; print date("d \d\\e M \d\\e\l Y, H:i:s", $tiempo);//25 de Feb del 2004, 12:10:00
Lo que debemos notar aquí, es que es necesario escapar las letras d,e y l ya que para escribir las palabras "de" y "del" hacemos uso de letras que son formateadores de date:
- d - Día del mes, 2 dígitos con ceros iniciales
- e - Identificador de zona horaria
- l - Nombre completo del día de la semana
Y como existen esas letras reservadas, también existen muchas otras que no podemos usar dentro de la función date. Una posible solución sería concatenar distintas cadenas con varias funciones date a las cuales les pidamos sólo los valores numéricos que nos interesan (el mes, después el día, luego el año, la hora, etc.)
//armando una cadena con varias llamadas a date() usando diferentes caracteres de formato print date("d", $tiempo)." de ".date("M", $tiempo)." del ".date("Y, H:i:s", $tiempo);//25 de Feb del 2004, 12:10:00
Aunque funciona, complica mucho el escribir una simple fecha, ensucian nuestro código y sobre todo, vuelve dificil la localización de nuestra aplicación web a otros idiomas, ya que con esta aproximación, tendríamos que escribir diversas cadenas dependiendo del idioma en que mostremos la fecha. Con ese fin en mente, y la simplicidad del código, veamos el mismo ejemplo, pero con la función strftime
//primero establecemos el idioma regional a aplicar setlocale(LC_TIME, 'es_MX'); //LC_TIME aplica solo a date time, no afecta currency ni otros print utf8_encode(strftime("%A %d de %B del %G a las %H:%Mhrs", $tiempo));// miércoles 25 de febrero del 2004 a las 12:10hrs
¿Cómo logramos imprimir en español la fecha completa? bueno el primer paso a notar es la llamada al método setlocale donde indicamos a PHP que para el formateo de fechas aplique las reglas que tiene definidas en la configuración local que enviémos como segundo parámetro (el primer parámetro establece qué categoría de funciones serán afectadas como puede ser fecha, moneda, números, etc.) Una vez que definimos la configuración regional que va a usar nuestro código, podemos hacer uso de la función strftime donde le enviamos, al igual que con date(), una cadena formateada, pero en este caso, los caracteres que recibe no se asumen como formateadores si no como texto normal, en cambio, los caracteres formateadores a reconocer por strftime deben estar precedidos por un caracter de porcentaje %.
En el ejemplo se puede observar que están escritas literalmente las palabras de, del, a, las, y hrs sin necesidad de escapar ninguno de sus caracteres, en cambio usamos, por ejemplo:
- %A - Nombre completo del día de la semana
- %B - Nombre completo del mes
- %H - Hora en dos dígitos de 24hrs
Otro detalle a notar del ejemplo anterior, es que la salida de strftime la ingresamos a utf8_encode ya que, dependiendo de la configuración de nuestro servidor, de los headers de respuesta y de los meta encoding de nuestra web, es posible que la salida formateada en español, contenga caracteres no codíficados en UTF8, esto varía entre sistemas, por lo que no siempre es necesario el uso de la codificación por medio de utf8_encode
De igual forma como pudimos traducir la fecha de inglés a español, podemos hacerlo con otro idioma, siempre y cuando nuestro servidor cuente con la configuración regional necesaria:
//cambiando el locale setlocale(LC_TIME, 'it_IT'); //LC_TIME aplica solo a date time, no afecta currency ni otros print strftime("%A %d %B %G alle ore %H:%M", $tiempo);// mercoledì 25 febbraio 2004 alle ore 12:10
En este ejemplo, aprovechamos la configuración regional (locale) en Italiano, pero es importante notar que como tal, strftime no se encarga de traducir la fecha, en cambio nos proporciona la equivalencia de las palabras y la forma de escribirlas en distintos idiomas, la traducción del resto del texto que conforma la fecha, depende del resto de la cadena que alimenta a la función (notese que eliminé las palabras de, del, a las y escribí alle ore para representar de mejor forma la fecha y hora en italiano)
La lista completa de formateadores, tanto para date, como para strftime las podemos encontrar en la documentación oficial de PHP.
¡Felices sentencias!