2010-08-15 15 views
6

¿Es posible recuperar un patrón predeterminado para una configuración regional determinada, sin convertir un objeto devuelto por DateFormat.get*Instance() en SimpleDateFormat?¿Hay alguna otra forma de recuperar el patrón predeterminado para una configuración regional determinada?

Entiendo que en la mayoría de los casos todo estará bien, pero hay una nota en javadoc, here: "Si desea aún más control sobre el formato o el análisis (o si desea otorgar a sus usuarios más control), Puedes intentar lanzar el DateFormat que obtienes de los métodos de fábrica a SimpleDateFormat. Esto funcionará para la mayoría de los países; solo recuerda ponerlo en un bloque try en caso de que encuentres uno inusual. "

Así que me pregunto, ¿qué debo hacer en caso de que "encuentre una inusual uno"?

Related theme.

Ejemplo de código:

/** 
* Returns '\n'-separated string with available patterns. 
* Optional adds appropriate language code to each pattern string. 
* 
* @param showLanguage Defines if language info is required. 
* @return String with available patterns, optional (if showLanguage is set 
* to "true") adds appropriate language code to each pattern. 
*/ 
public String getPatternsForAvailableLocales(Boolean... showLanguage) { 

    /* Array of available locales */ 
    Locale[] locales = DateFormat.getAvailableLocales(); 

    String result = ""; 

    for (Locale locale : locales) { 

     /* Add language info, if necessary */ 
     if ((showLanguage.length > 0) && (showLanguage[0])) { 
      result += locale.getLanguage() + '\t'; 
     } 

     /* Retrieving pattern */ 
     try { 
      result += ((SimpleDateFormat) 
        DateFormat.getDateTimeInstance(DateFormat.SHORT, 
          DateFormat.SHORT, locale)).toPattern(); 
     } catch (ClassCastException e) { 
      // ******************************** // 
      // What's up? Is there another way? // 
      // ******************************** // 
     } 

     result += '\n'; 

    } 
    return result; 
} 
+0

No estoy seguro si puede hacer algo si "encuentra uno inusual" porque puede no estar basado en patrones. Especialmente porque un desarrollador puede proporcionar su propio 'DateFormat' a través de' java.text.spi.DateFormatProvider'. –

Respuesta

1

Puede recuperar los símbolos de formato de fecha para un idioma en particular ejecutando el siguiente código Java:

System.out.println(DateFormatSymbols.getInstance 
     (new Locale("en_US")).getLocalPatternChars()); 
System.out.println(DateFormatSymbols.getInstance 
     (new Locale("nl_NL")).getLocalPatternChars()); 

En este caso particular, holandés, los símbolos de formato de fecha son los mismos.

GyMdkHmsSEDFwWahKzZ 
GyMdkHmsSEDFwWahKzZ 

En el caso de que los símbolos de la lengua extranjera son diferentes, usted substituye el carácter de lenguas extranjeras para el personaje de Inglés en el formato de cadena sencilla.

La clase DateFormatSymbols existe desde al menos Java 1.4.2.

2

El patrón mismo es aplicable sólo a SimpleDateFormat que es por eso que estás lanzando.

Si encuentra un DateFormat que no es SimpleDateFormat, desea registrar la excepción, registrar la clase de la implementación real y, en ese momento, tendrá suficiente información para decidir cómo manejar la situación.

Por ahora, dado que no hay un patrón, no agregue este a la lista de resultados si no es SimpleDateFormat.

Si puedo preguntar, ¿Por qué devuelve una Cadena concatenada en lugar de una Colección de Cadenas? Parece que sería más fácil recorrer tus resultados.

Si la cadena concatenada es esencial, utilice StringBuilder para compilarla, ya que creará menos objetos y mejorará el rendimiento. Es un buen hábito estar en la construcción de cadenas en un bucle.

+0

Thx por tu respuesta. Aunque no proporcionó una respuesta directa para una pregunta concreta, sugirió una solución armoniosa para manejar esta posible situación (como se muestra en la práctica, situación muy poco probable, pero posible). Por lo tanto, creo que su respuesta podría ser aceptada como solución. – Milkywayfarer

+0

Más de THX para sus comentarios sobre el código.Respondiendo a sus preguntas: – Milkywayfarer

+0

1) sí, estoy de acuerdo en que usar la colección de cadenas sería más conveniente, pero esto fue solo un código demostrativo para aclarar de qué se trataba. – Milkywayfarer

Cuestiones relacionadas