2011-07-15 41 views
10

Estoy ejecutando mi aplicación Java en una máquina con Windows 7 donde mi configuración regional está configurada para dar formato a fechas como YYYY-mm-dd y hora como HH : mm: ss (por ejemplo, "2011-06-20 07:50:28"). Pero cuando uso DateFormat.getDateTimeInstance().format para formatear mi fecha, no veo que en su lugar recibo "20-jun-2011 7:50:28 AM". ¿Qué debo hacer para formatear las fechas en la forma en que mis clientes tienen configurada su sistema operativo para mostrar las fechas?Cómo puedo configurar el formato de fecha y hora en Java que respeta la configuración del sistema operativo del usuario

Aquí es lo que mi código en cuestión es así:

File selGameLastTurnFile = selectedGame.getLastTurn().getTurnFile(); 
Date selGameModifiedDate = new Date (selGameLastTurnFile.lastModified()); 
if (selectedGame.isYourTurn()) { 
    gameInfo = Messages.getFormattedString ("WhoseTurnIsIt.Prompt.PlayTurn", //$NON-NLS-1$ 
      FileHelper.getFileName (selGameLastTurnFile), 
      DateFormat.getDateTimeInstance().format(selGameModifiedDate)); 
} else { 
    gameInfo = Messages.getFormattedString ("WhoseTurnIsIt.Prompt.SentTurn", //$NON-NLS-1$ 
      selGameLastTurnFile.getName(), 
      DateFormat.getDateTimeInstance().format(selGameModifiedDate)); 
} 

Los Messages.getFormattedString llamadas están utilizando MessageFormat para poner la fecha en una frase que se verá así:

Jugar la vuelta ' QB Nat vs Ian 008 '(recibido 20-jun-2011 7:50:28 AM)

Sin embargo, mi configuración de SO está configurada para formatear la fecha como He descrito anteriormente y que esperaba ver esto:

Jugar la vuelta 'QB Nat vs Ian 008' (recibió 2011-06-20 07:50:28)

busqué aquí y otra Los sitios de programación de Java y no pude encontrar la respuesta, pero esto parece algo tan obvio que quiero hacer que siento que me falta algo obvio.

+0

Para obtener una aclaración, intento obtener el formato de fecha y hora especificado por la configuración del sistema operativo de mis clientes. Muchas personas, incluido yo mismo, modificamos la configuración de fecha, hora y moneda de los valores predeterminados de la configuración regional. No quiero simplemente obtener lo que alguien en Oracle cosas es la forma en que las fechas deben formatearse para una configuración regional particular. Quiero el formato que mis clientes han establecido en su sistema operativo. Espero que mi solicitud sea más clara. –

+0

Es realmente molesto que mi implementación en C pueda hacerlo, pero no Java. 'strftime ("% c ")' con locale '" "' funciona a la perfección. – aib

Respuesta

4

No puede hacer esto en Java puro. No hay forma de que Sun/Oracle pueda hacer que este sistema sea independiente.

Un vistazo rápido de las bibliotecas .NET da this page - citar:

El usuario puede optar por anular algunos de los valores asociados a la cultura actual de Windows a través de la porción de opciones de idioma y regionales de control Panel. Por ejemplo, el usuario puede optar por mostrar la fecha en un formato diferente o usar una moneda que no sea la predeterminada para la cultura. Si la propiedad CultureInfo.UseUserOverride se establece en true, las propiedades del objeto CultureInfo.DateTimeFormat, el objeto CultureInfo.NumberFormat y el objeto CultureInfo.TextInfo también se recuperan de la configuración del usuario.

Le sugiero que haga esto de una manera que dependa del sistema de Windows si necesita esta funcionalidad (por ejemplo, acceda al registro de Windows como se sugirió @laz).

+1

En realidad, Sun/Oracle ha * elegido * no hacerlo. Ya tienen JVM específicas del sistema y esas JVM ya tienen acceso al usuario configuración local (entre otros) simplemente eligieron no cubrir todas las bases. Gracias por la información, francamente, eso era lo que esperaba. Esperaba que tal vez alguien supiera de una biblioteca JNI que funcionaría con al menos algunas plataformas . –

+1

@Ian Después de un poco más de investigación resulta que la función para el tiempo especificado por el usuario y el formato de fecha es compatible con más sistemas operativos de lo que pensaba. No todos los sistemas operativos lo admiten, pero probablemente no sea demasiado difícil para Sun/Oracle usar configuraciones regionales personalizadas en el SO que lo hagan y dejarlo transparente para el usuario. – Bringer128

1

Quizás esté entendiendo mal lo que está tratando aquí, pero necesita usar la configuración regional.

DateFormat df = DateFormat.getDateInstance(DateFormat.LONG, Locale.FRANCE); 

Al usar Locale, puede controlar qué formato para qué región está utilizando.

+2

Sí, pero la configuración regional es algo que el usuario también puede configurar en su sistema operativo. Parece que Frankie tiene una forma de conseguir eso. Probando su sugerencia ahora ... –

7

Primero tienes que decirle a Java cuál es tu sistema LOCALE.

Check Java System.
String locale = System.getProperty("user.language")

And then format the date accordinly (SimpleDateFormat)
SimpleDateFormat(String pattern, Locale locale)

Consulte el código de Java práctica para un ejemplo de trabajo ...

String systemLocale = System.getProperty("user.language"); 
String s; 
Locale locale; 

locale = new Locale(systemLocale); 
s = DateFormat.getDateInstance(DateFormat.MEDIUM, locale).format(new Date()); 
System.out.println(s); 
// system locale is PT outputs 16/Jul/2011 

locale = new Locale("us"); 
s = DateFormat.getDateInstance(DateFormat.MEDIUM, locale).format(new Date()); 
System.out.println(s); 
// outputs Jul 16, 2011 

locale = new Locale("fr"); 
s = DateFormat.getDateInstance(DateFormat.MEDIUM, locale).format(new Date()); 
System.out.println(s); 
// outputs 16 juil. 2011 
+0

Gracias por la forma de obtener la configuración regional del sistema (entendí que si no especificaste la configuración regional se usaría el sistema por defecto). Lo estoy intentando ahora. –

+0

Ok, lo que probé tampoco funcionó. No quiero especificar el patrón a usar para formatear la fecha en que quiero usar la que el usuario ha configurado con su sistema operativo. Creo que esa es la única forma razonable de hacerlo. Tengo mi configuración regional en inglés (Canadá) y mis patrones de fecha y hora de la manera que quiero establecer en el sistema operativo. Mis usuarios habrán hecho lo mismo. usando 'Locale locale = new Locale (System.getProperty (" user.language "), System.getProperty (" user.country "));' Puedo obtener la configuración regional correcta, pero cuando la uso con 'DateFormat.getDateTimeInstance' I * no * obtiene el formato especificado por el sistema operativo. –

+0

Acabo de cambiar al uso de 'new SimpleDateFormat(). Format (selGameModifiedDate)' que dice que usa el patrón predeterminado para la configuración regional predeterminada. Pero está * no * usando mi configuración de sistema operativo. ¿Cuál es la magia aquí? Seguramente todos los que programan en Java desean presentar los datos, el tiempo y otros elementos formateados como espera el usuario según la configuración del sistema operativo. Gracias por su ayuda. Espero que alguien tenga alguna idea sobre cómo hacer esto. –

3

Me parece que tendrá que acceder a las ventanas registro para esto. Vea esta pregunta para varias soluciones a eso read/write to Windows Registry using Java.

Una vez que elija uno de los muchos métodos para acceder al registro, deberá obtener la clave correcta del registro para el formato. This documento indica que la clave para usar es HKEY_USERS\.Default\Control Panel\International.

Al usar GNOME en Linux, puede usar el comando gconftool similar al comando reg para Windows como se menciona en los enlaces anteriores sobre el registro de Windows.Veo la tecla /apps/panel/applets/clock_screen0/prefs/custom_format en mi configuración, aunque es blanco desde que estoy usando el valor por defecto:

gconftool -g /apps/panel/applets/clock_screen0/prefs/custom_format 

No estoy seguro de si ese es el valor que te gustaría utilizar para sus propósitos o no.

En Mac OS, no estoy seguro de qué harías.

+0

Muchas cosas buenas en el enlace que ha agregado - Gracias. Sin embargo, como cabría esperar, solo es Windows :-( Parece que no hay una solución genérica para este problema. Lástima que Sun/Oracle eligió no poner esto a disposición. –

+0

Lo siento, no vi que estuvieras buscando para una forma de plataforma cruzada para hacer esto. – laz

+0

Estoy buscando, pero parece que no hay uno. –

Cuestiones relacionadas