2011-03-02 19 views
7

A menudo creo SimpleDateFormat con patrones como HH:mm:ss o yyyy-MM-dd para dar salida a las fechas en una configuración regional de manera independiente. Dado que también hay un constructor que toma un parámetro de configuración regional adicional, me pregunto si hay casos en los que dicho formato puede depender de la configuración regional, o si siempre debo especificar Locale.ENGLISH o Locale.GERMANY. Supongamos que la zona horaria está configurada explícitamente.¿Depende de la configuración regional SimpleDateFormat?

Respuesta

15

acaba de encontrar el método estático getAvailableLocales en la configuración regional, y resulta que todos los campos de un calendario puede ser depende del local:

public static void main(String[] args) { 
    String pattern = "yyyy-MM-dd HH:mm:ss"; 
    Date date = new Date(); 
    String defaultFmt = new SimpleDateFormat(pattern).format(date); 

    for (Locale locale : Locale.getAvailableLocales()) { 
     String localeFmt = new SimpleDateFormat(pattern, locale).format(date); 
     if (!localeFmt.equals(defaultFmt)) { 
      System.out.println(locale + " " + localeFmt); 
     } 
    } 
} 

En mi sistema (en Alemania que ejecuta una versión Inglés de ubuntu), este emite la siguiente lista, esperemos que el carácter unicode vienen a través intacta:

ja_JP_JP 23-03-03 16:53:09 
hi_IN २०११-०३-०३ १६:५३:०९ 
th_TH 2554-03-03 16:53:09 
th_TH_TH ๒๕๕๔-๐๓-๐๓ ๑๖:๕๓:๐๙ 

Así Japan y Thailand utiliza una época diferente, pero ar De lo contrario, se basa en el gregorian calendar, lo que explica por qué el mes y el día son los mismos.

Otras configuraciones regionales también usan scripts diferentes para escribir números, por ejemplo Hindi hablados en India y una variante de tailandés en Tailandia.

Para responder a la pregunta, la configuración regional siempre debe especificarse a un valor conocido cuando se necesita una cadena independiente de configuración regional.

Editar: Java 1.6 agregó una constante Locale.ROOT para especificar un idioma/país neutral. Esto sería preferible a especificar la configuración regional en inglés para la salida dirigida a una computadora.

La configuración regional de la raíz es la configuración regional cuyo idioma, país y variante son cadenas vacías (""). Esto se considera como la configuración regional base de todas las configuraciones regionales, y se utiliza como la configuración regional de idioma/país neutral para las operaciones sensibles de la configuración regional.

4

Sí, SimpleDateFormat es absolutamente sensible a la configuración regional. Ciertos campos, como horas y minutos, son independientes de la configuración regional.

SimpleDateFormat también soporta localizadas fecha y hora patrón cuerdas. En estas cadenas, las letras de patrón descritas anteriormente pueden reemplazarse por otras letras de patrón dependientes de la configuración regional. SimpleDateFormat no se ocupa de la localización de texto que no sean las letras de patrón; eso depende del cliente de la clase.

O bien, puede utilizar el método DateFormat#getDateInstance() fábrica de localización de usar en su lugar, ya que:

public SimpleDateFormat(String pattern, Locale locale)

Construye un SimpleDateFormat utilizando el patrón dado y los símbolos de formato de fecha por defecto de la localidad dada . Nota: Este constructor puede no ser compatible con todas las configuraciones regionales. Para una cobertura completa, use los métodos de fábrica en la clase DateFormat.

+0

estoy preguntando por los patrones que no contienen cualquier mes o nombres de día, por ejemplo 'aaaa-MM-dd', y deseo una salida independiente de configuración regional, posiblemente guardando algunas teclas al omitir el parámetro de configuración regional. –

+0

@ Jörn: ¡ah! En ese ejemplo específico, no debería tener problemas para omitir el parámetro adicional. El formateo de zonas horarias puede ser una historia diferente, sin embargo. Aún así, es mejor dejar que Java se preocupe por los formatos específicos de la configuración regional (por ejemplo, decidir cuándo usar 'mm/dd/aaaa' frente a' dd/mm/aaaa'). –

+1

He tomado el hábito de especificar siempre una configuración regional (al menos cuando la aplicación no es una aplicación cliente donde siempre se usa la configuración regional del sistema), para asegurarme de que yo (u otra persona) no olvide especificar uno si el patrón tuvo que cambiar. Un poco como la regla de usar siempre corchetes alrededor de los bloques, incluso si solo tiene una línea. –

0

Esto funciona para mí, tal vez deberías probarlo: salida

String time = new SimpleDateFormat("HH:mm:ss").format(new Date());

Consola:

11:52:45 
Cuestiones relacionadas