Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Formateo de Fechas con Locale

Buenas!

Estoy haciendo una aplicación en la que tengo un método de utilidades que convierte una Date en String, pero a la hora de poner la aplicación en otro idioma tengo problemas...

Este es el método que convierte la fecha en cadena de texto:


public static String dateToString(Date fecha, String formato) {
getDateFormat().applyLocalizedPattern(formato);
return getDateFormat().format(fecha);
}


private static ThreadLocal dateFormat = new ThreadLocal() {
protected synchronized Object initialValue() {
return new SimpleDateFormat();
}
};

public static SimpleDateFormat getDateFormat() {
return (SimpleDateFormat) (dateFormat.get());
}


El problema es que cuando el idioma es otro que no sea Español o Inglés (por ejemplo Catalán: ca_ES) y le indico que el formato de la fecha sea dd/MM/yyyy me lanza la siguiente excepción:


java.lang.IllegalArgumentException: Illegal pattern character 'd'
at java.text.SimpleDateFormat.translatePattern(SimpleDateFormat.java:2000)
at java.text.SimpleDateFormat.applyLocalizedPattern(SimpleDateFormat.java:2055)
at es.novasoft.nfc.comun.utilidades.NFCFecha.dateToString(NFCFecha.java:751)
at es.novasoft.nfc.comun.utilidades.NFCFecha.dateToString(NFCFecha.java:737)
at es.novasoft.nfc.comun.utilidades.NFCFecha.hoyTexto(NFCFecha.java:484)
at com.csc.health.vacc.cliente.paneles.estadisticas.ListadosFiltroControlador.inicializa(ListadosFiltroControlador.java:267)
at com.csc.health.vacc.cliente.paneles.estadisticas.ListadosFiltroControlador.cargarDatos(ListadosFiltroControlador.java:1000)
at com.csc.health.vacc.cliente.paneles.Ventana$10.construct(Ventana.java:755)
at es.novasoft.nfc.cliente.utilidades.NFCSwingWorker$2.run(NFCSwingWorker.java:110)
at java.lang.Thread.run(Thread.java:662)


Al parecer esto es porque lo caracteres establecidos en DateFormatSymbols.getLocalPatternChars() son distintos para cada Locale.
Una posible solución sería establecer, siempre que llame a este método, los caracteres que tiene el Locale español (getDateFormat().getDateFormatSymbols().setLocalPatternChars("GyMdkHmsSEDFwWahKzZ")),
pero esto no me parece correcto.

¿Hay alguna forma, independientemente del Locale establecido, en que yo le pase el formato dd/MM/yyyy y el lo comprenda?


He visto en alguna web la manera de obtener el "Localized Pattern", así:


final DateFormat dateInstance = DateFormat.getDateInstance(DateFormat.SHORT, Locale.getDefault());
final String format = dateInstance.format(adFecha);

if (dateInstance instanceof SimpleDateFormat) {
final String pattern = ((SimpleDateFormat) dateInstance).toPattern(); //dd/MM/yy
final String localizatedPattern = ((SimpleDateFormat) dateInstance).toLocalizedPattern(); //para ca_ES sería tt/MM/uu
}
return getDateFormat().format(adFecha);

El problema de esto es que me tengo que ceñir a las constantes de DateFormat para el formato. Por eso como comento más ariiba lo que me gustaría conseguir es que yo le indicase la cadena dd/MM/yyyy y el me devolviera tt/MM/uuuu (en el caso de ca_ES).

¿Alguien ha tenido este problema?

Gracias y Saludos!

mayo 14, 2012 | Registered Commenterhuspy

A ver si ésto te ayuda:

http://www.exampledepot.com/egs/java.text/FormatDateLoc.html

mayo 14, 2012 | Registered Commenterchoces

Hola!

Si, eso lo había mirado, pero el problema ahí es que para hacer eso es necesario crear una nueva instancia de SimpleDateFormat y yo tengo una única instancia. He leído por ahí que es más efectivo y demás...

Saludos!

mayo 14, 2012 | Registered Commenterhuspy