Foros del Web » Programación para mayores de 30 ;) » Java »

Formateo de Fechas con Locale

Estas en el tema de Formateo de Fechas con Locale en el foro de Java en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 14/05/2012, 03:40
Avatar de huspy  
Fecha de Ingreso: diciembre-2008
Ubicación: Málaga, España
Mensajes: 120
Antigüedad: 15 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)

Etiquetas: formateo, locale, string
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:05.