Internacionalización de Programas Java

Los objetos Date representan fechas y horas. No se puede mostrar o imprimir un objeto Date sin convertirlo primero a un String que est� en el formato apropiado. Pero, �Cu�l es el formato adecuado? Primero, el formato deber�a estar conforme a las convenciones de la Localidad del usuario final. Por ejemplo, los alemanes reconocer�n esto 9.4.98 como una fecha v�lida, pero los norteamericanos esperar�n que la misma fecha aparezca como 4/9/98. Segundo, el formato deber�a incluir la informaci�n necesaria. Por ejemplo, un progama que mida el rendimiento de una red podr�a mostrar milisegundos. Probablemente un calendario de citas on-line no mostrar� milisegundos, pero si que mostrar� los d�as de la semana.

Esta lecci�n explica como formatear fechas y horas en diferentes formas, y de una manera sensible a la Localidad. Si sigues las t�cnicas descritas en esta lecci�n, tus programas no s�lo mostrar�n las fechas y horas en la Localidad apropiada, sino que el c�digo fuente permanecera independiente de cualquier Localidad espec�ficada.

.�Utilizar Formato Predefinidos

La clase DateFormat proporciona estilos de formateo predefinidos que son espec�ficos de la Localidad y f�ciles de utiliar.

La clase DateFormat permite formatear fechas y horas con estilos predefinidos de una forma sensible a la Localidad, DateFormat no soporta todas las posibles definiciones de Localidades. Para ver las definiciones de Locale que reconoce DateFormat, llamamos al m�todo getAvailableLocales.

Locale[] locales = DateFormat.getAvailableLocales();

En las siguientes secciones, veremos c�mo formatear fechas y horas con la clase DateFormat. Los ejemplos se han sacado el programa DateFormatDemo.java.

.�Fechas

Formatear fechas con la clase DateFormat es un proceso en dos pasos. Primero se crea un formateador con el m�todo getDateInstance. Segundo, se llama al m�todo format, que devuelve un String que contiene la fecha formateada. En el siguiente ejemplo, hemos formateado la fecha de hoy llamando a estos dos m�todos.

Date today;
String dateOut;
DateFormat dateFormatter;

dateFormatter = 
   DateFormat.getDateInstance(DateFormat.DEFAULT, currentLocale);
today = new Date();
dateOut = dateFormatter.format(today);

System.out.println(dateOut + "   " + currentLocale.toString());

Aqu� est� la salida generada por este c�digo. Observa que los formatos de fechas var�an con la Localidad. Como DateFormat es sensible a la Localidad, tiene cuidado de los detalles de formateo para cada Localidad.

9 avr 98   fr_FR
9.4.1998   de_DE
09-Apr-98   en_US

En el ejemplo de c�digo anterior, hemos espec�ficado el estilo de formato DEFAULT. Este estilo es s�lo uno de los estilos de formato predefinidos que proporciona la clase DateFormat.

  • DEFAULT
  • SHORT
  • MEDIUM
  • LONG
  • FULL

La siguiente tabla muestra c�mo se formatea cada estilo para las Localidades de U.S. y Francia.

Estilo Localidad U.S. Localidad Francia
DEFAULT 10-Apr-98 10 avr 98
SHORT 4/10/98 10/04/98
MEDIUM 10-Apr-98 10 avr 98
LONG April 10, 1998 10 avril 1998
FULL Friday, April 10, 1998 vendredi, 10 avril 1998

.�Horas

Los objetos Date representan tanto fechas como horas. Formatear horas con la clase DateFormat es similar al formateo de fechas, excepto en que el formateador se crea con el m�todo getTimeInstance.

DateFormat timeFormatter = 
   DateFormat.getTimeInstance(DateFormat.DEFAULT, currentLocale);

La siguiente tabla muestra los estilos de formatos predefinidos para las horas en las localidades de U.S. y Alemania.

Estilo Localidad U.S. Localidad Alemania
DEFAULT 3:58:45 PM 15:58:45
SHORT 3:58 PM 15:58
MEDIUM 3:58:45 PM 15:58:45
LONG 3:58:45 PM PDT 15:58:45 GMT+02:00
FULL 3:58:45 oclock PM PDT 15.58 Uhr GMT+02:00

.�Fechas y Horas

Para mostrar la fecha y la hora en la misma String, se crea el formateador con el m�todo getDateTimeInstance. El primer par�metro es el estilo de fecha y el segundo es el estilo de la hora. El tercer par�metro es nuestro viejo amigo Locale. Aqu� tienes un ejemplo r�pido.

DateFormat formatter;

formatter = DateFormat.getDateTimeInstance(DateFormat.LONG,
                                           DateFormat.LONG,
                                           currentLocale);

Para la localidad de U.S., el formateado de este ejemplo, formatear� la fecha y la hora de esta forma.

April 10, 1998 4:05:54 PM PDT 

Si el ejemplo del formateador se hubiera creado con la Localidad Francia, el String devuelto por el m�todo format ser�a.

11 avril 1998 01:05:54 GMT+02:00

.�Formatear con Patrones

Con la clase SimpleDateFormat, se pueden crear formatos personalizados espec�ficos de la Localidad.

En la secci�n anterior, Utilizar formatos predefinidos, describimos los estilos de formatos proporcionados por la clase DateFormat. En la mayor�a de los casos, estos formatos predefinidos son suficiente. Sin embargo, si se quieren crear formatos personalizados, se debe utilizar la clase SimpleDateFormat.

En la siguientes l�neas, proporcionaremos varios ejemplos de c�digo que demuestran el uso de los m�todos de la clase SimpleDateFormat. Podr�s encontrar el c�digo completo en el fichero llamado SimpleDateFormatDemo.java.

.� Sobre los Patrones

Cuando se crea un objeto SimpleDateFormat, se espec�fica un patr�n en un String. Los contenidos de este patr�n determinan el formato de la fecha y de la hora. Para una descripci�n completa sobre la s�ntaxis de los patrones puedes ver las tablas de la secci�n S�ntaxis de los Patrones de Formato de Fechas. Podremos ver algunos ejemplos de patrones en los siguientes ejemplos.

En el siguiente c�digo hemos espec�ficado el patr�n cuando se crea el objeto SimpleDateFormat y luego llamamos al m�todo format. El String devuelto por el m�todo format contiene la fecha y hora formateadas y est� lista para mostrarse.

Date today;
String output;
SimpleDateFormat formatter;

formatter = new SimpleDateFormat(pattern, currentLocale);
today = new Date();
output = formatter.format(today);

System.out.println(pattern + "   " + output);

La tabla siguiente muestra la salida generada por el c�digo anterior cuando se especifica la localidad de U.S..

patr�n Salida
dd.MM.yy 09.04.98
yyyy.MM.dd G 'at' hh:mm:ss z 1998.04.09 AD at 06:15:55 PDT
EEE, MMM d, ''yy Thu, Apr 9, '98
h:mm a 6:15 PM
H:mm 18:15
H:mm:ss:SSS 18:15:55:624
K:mm a,z 6:15 PM,PDT
yyyy.MMMMM.dd GGG hh:mm aaa 1998.April.09 AD 06:15 PM

.�Patrones y Localidades

La clase SimpleDateFormat es sensible a la localidad. Si se ejemplariza SimpleDateFormat sin un par�metro Locale, formatear� la fecha y hora de acuerdo a la Localidad por defecto. Tanto el patr�n como la Localidad determinan el formato. Para el mismo patr�n, la clase SimpleDateFormat podr�a formatear la fecha y la hora de forma diferente si var�a la Localidad.

En el siguiente ejemplo, el patr�n est� codificado en la sentencia que crea el objeto SimpleDateFormat.

Date today;
String result;
SimpleDateFormat formatter;

formatter = new SimpleDateFormat("EEE d MMM yy", currentLocale);
today = new Date();
result = formatter.format(today);

System.out.println("Locale: " + currentLocale.toString());
System.out.println("Result: " + result);

El c�digo anterior genera esta salida. Aunque el patr�n est� codificado,el formato de la fecha cambia cada vez que se especifica una Localidad diferente.

Locale: fr_FR
Result: ven 10 avr 98

Locale: de_DE
Result: Fr 10 Apr 98

Locale: en_US
Result: Thu 9 Apr 98

.�Cambiar los S�mbolos de Formateo

Utilizando la clase DateFormatSymbols, se pueden cambiar los s�mbolos que representan los nombres de los meses, de los d�as de la semana, y otros elementos de formateo.

El m�todo format de SimpleDateFormat devuelve un String formado por d�gitos y s�mbolos. Por ejemplo, en el String "Friday, April 10, 1998," los s�mbolos son "Friday" y "April." Si los s�mbolos encapsulados en SimpleDateFormat no cubren tus necesidades, puedes cambiarlos con la clase DateFormatSymbols. Se pueden cambiar los s�mbolos que representan los nombres de los meses, de los d�as de las semana, de las zonas horarias. etc.

Echemos un vistazo a un ejemplo que modifica los nombres cortos de los d�as de la semana. Podr�s encontrar el c�digo fuente de este ejemplo en el fichero llamado DateFormatSymbolsDemo.java. En este ejemplo, empezamos creando un objeto DateFormatSymbol para la Localidad de U.S. Tenemos curiosidad sobre las abreviaturas que encapsula DateFormatSymbol para los d�as de la semana, por eso llamamos al m�todo getShortWeekdays. Hemos decidido crear versiones en may�sculas de estas abreviaturas en el array de String llamado capitalDays. Luego aplicamos el nuevo conjunto de s�mbolos de captitalDays al objeto DateFormatSymbol con el m�todo setShortWeekdays. Finalmente , ejemplarizamos la clase SimpleDateFormat, espec�ficando el DateFormatSymbol que ten�a los nuevos nombres. Aqu� est� el c�digo fuente.


Date today;
String result;
SimpleDateFormat formatter;
DateFormatSymbols symbols;
String[] defaultDays;
String[] modifiedDays;

symbols = new DateFormatSymbols(new Locale("en","US"));
defaultDays = symbols.getShortWeekdays();

for (int i = 0; i < defaultDays.length; i++) {
   System.out.print(defaultDays[i] + "  ");
}
System.out.println();

String[] capitalDays = {
   "", "SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"};
symbols.setShortWeekdays(capitalDays);

modifiedDays = symbols.getShortWeekdays();
for (int i = 0; i < modifiedDays.length; i++) {
   System.out.print(modifiedDays[i] + "  ");
}

System.out.println();
System.out.println();

formatter = new SimpleDateFormat("E", symbols);
today = new Date();
result = formatter.format(today);
System.out.println(result);

La salida generada por este c�digo se muestra abajo. La primera l�nea contiene los nombres cortos de los d�as de la semana antes de cambiarlos. La segunda l�nea contiene los nombres en may�sculas que hemos aplicado con el m�todo setShortWeekdays. Estas dos primeras l�neas parecen identadas, porque la primera cadena del array de nombres es null. La �ltima l�nea muestra el resultado devuelto por el m�todo SimpleDateFormat.format.

  Sun  Mon  Tue  Wed  Thu  Fri  Sat  
  SUN  MON  TUE  WED  THU  FRI  SAT  

WED

.�S�ntaxis de los Patrones de Fechas

Se puede dise�ar un patr�n de formato personalizado para fechas y horas con la lista de s�mbolos de la siguiente tabla:

S�mboloSignificadoPresentaci�nEjemplo
Gdesignador de eraTextoAD
ya�oN�mero1996
Mmes del a�oTexto y N�mero Julio y 07
dd�a del mesN�mero10
hhora en am/pm (1-12)N�mero12
Hhora del d�a (0-23)N�mero0
mminutoN�mero30
ssegundoN�mero55
SmilisegundoN�mero978
Ed�a de la SemanaTexto Jueves
Dd�a del a�oN�mero189
Fd�a de la semana en el mesN�mero2 (2nd Wed in July)
w Semana del a�o N�mero 27
W Semana en el mes N�mero 2
a Marcador am/pm Texto PM
k hora del d�a(1-24) N�mero 24
K hora en am/pm (0-11) N�mero 0
z Zona horaria Texto Pacific Standard Time
' escape para texto Delimitador (none)
' Comilla simple Literal '

Los caracteres que no son letras se tratan como texto entrecomillado. Esto es, apareceran en el texto formateado aunque no esten encerrados entre comillas.

El n�mero de s�mbolos y letras espec�ficadas tambi�n determina el formato. Por ejemplo, si el patr�n "zz" resulta "PDT," el patr�n "zzzz" generar� "Pacific Daylight Time." La siguiente tabla sumariza estas reglas:

Presentaci�nN�meros o s�mbolosResultado
Texto 1 - 3 forma abreviada, si existe
Texto>= 4 forma completa
N�meroSe requiere el menor n�mero de d�gitos Los n�meros cortos se rellenan con ceros (para un a�o, si el n�mero de 'y' es 2, el a�o se truncar� a 2 d�gitos)
Texto y N�mero1 - 2forma de texto
Texto y N�mero3forma num�rica

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP