Ver Mensaje Individual
  #1 (permalink)  
Antiguo 14/05/2012, 03:40
Avatar de huspy
huspy
 
Fecha de Ingreso: diciembre-2008
Ubicación: Málaga, España
Mensajes: 120
Antigüedad: 16 años, 3 meses
Puntos: 2
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:

Código Java:
Ver original
  1. public static String dateToString(Date fecha, String formato) {
  2.     getDateFormat().applyLocalizedPattern(formato);
  3.     return getDateFormat().format(fecha);
  4. }
  5.  
  6.  
  7. private static ThreadLocal dateFormat = new ThreadLocal() {
  8.     protected synchronized Object initialValue() {
  9.         return new SimpleDateFormat();
  10.     }
  11. };
  12.  
  13. public static SimpleDateFormat getDateFormat() {
  14.     return (SimpleDateFormat) (dateFormat.get());
  15. }


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:

Código Java:
Ver original
  1. java.lang.IllegalArgumentException: Illegal pattern  character 'd'
  2.         at java.text.SimpleDateFormat.translatePattern(SimpleDateFormat.java:2000)
  3.         at java.text.SimpleDateFormat.applyLocalizedPattern(SimpleDateFormat.java:2055)
  4.         at es.novasoft.nfc.comun.utilidades.NFCFecha.dateToString(NFCFecha.java:751)
  5.         at es.novasoft.nfc.comun.utilidades.NFCFecha.dateToString(NFCFecha.java:737)
  6.         at es.novasoft.nfc.comun.utilidades.NFCFecha.hoyTexto(NFCFecha.java:484)
  7.         at com.csc.health.vacc.cliente.paneles.estadisticas.ListadosFiltroControlador.inicializa(ListadosFiltroControlador.java:267)
  8.         at com.csc.health.vacc.cliente.paneles.estadisticas.ListadosFiltroControlador.cargarDatos(ListadosFiltroControlador.java:1000)
  9.         at com.csc.health.vacc.cliente.paneles.Ventana$10.construct(Ventana.java:755)
  10.         at es.novasoft.nfc.cliente.utilidades.NFCSwingWorker$2.run(NFCSwingWorker.java:110)
  11.         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().setLocalPa tternChars("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í:

Código Java:
Ver original
  1. final DateFormat dateInstance = DateFormat.getDateInstance(DateFormat.SHORT, Locale.getDefault());
  2. final String format = dateInstance.format(adFecha);
  3.  
  4. if (dateInstance instanceof SimpleDateFormat) {
  5.     final String pattern = ((SimpleDateFormat) dateInstance).toPattern(); //dd/MM/yy
  6.     final String localizatedPattern = ((SimpleDateFormat) dateInstance).toLocalizedPattern(); //para ca_ES sería tt/MM/uu
  7. }
  8. 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!
__________________
"Lo escuché y lo olvidé, lo vi y lo entendí, lo hice y lo aprendí." (Confucio)