2008-10-21 10 views
5

Creación de una aplicación Java que admite diferentes configuraciones regionales, pero desea personalizar la visualización de DateFormat más allá de lo que está disponible entre las opciones FULL, LONG, MEDIUM y SHORT DateFormat. Me gustaría hacer cosas como colocar un carácter entre los componentes de fecha y hora de un DateFormat.getDateTimeFormat(), minúsculas de AM/PM, etc., al menos para inglés.Personalización de formateadores java.text para diferentes configuraciones regionales

puede pensar en 3 maneras de hacerlo:

1) Si la configuración regional es Inglés, usar mi cadena de formato personalizado en un nuevo objeto SimpleDateFormat.

2) modificar las cadenas de formato por defecto para las configuraciones regionales existentes

3) Crear una nueva variante local que especifica las cadenas de formato que quieren

No se puede encontrar la manera de hacer 2 o 3 (o si incluso es posible), y preferiría no hacer 1 ... ¿Alguien ha tratado con algo como esto antes?

también, parece que 2 o 3 serían necesarios para minicar la AM/PM? (Especificando el recurso AmPmMarkers para la configuración del formato de fecha del lugar)

Respuesta

0

Lo único similar que he tratado es el hecho de que "strftime" y "locale" dicen que el italiano debería usar dos puntos entre los campos de tiempo, pero Java pone completo -restaura entre ellos. Así que agregué el siguiente código:

// This is an incredibly ugly hack, but it's based on the fact that 
    // Java for some reason decided that Italy uses "." between 
    // hours.minutes.seconds, even though "locale" and strftime say 
    // something different. 
     hmsTimeFormat = DateFormat.getTimeInstance(DateFormat.MEDIUM); 
     if (hmsTimeFormat instanceof SimpleDateFormat) 
     { 
     String str = ((SimpleDateFormat)hmsTimeFormat).toPattern(); 
     str = str.replace('.', ':'); 
     hmsTimeFormat = new SimpleDateFormat(str); 
     } 
1

¿Por qué no utilizar un formato de mensaje en su lugar?

Usa el patrón "{0, date, short} tu texto aquí {0, time, short}" para hacer lo que quieras.

+2

porque a veces debe ser "{0, tiempo, short} aquí su texto {0, date, short}", dependiendo de la lugar. –

0

manera más satisfactoria para resolver esto que hemos descubierto es cargar Cuerdas de la mañana, la tarde, formatString de un paquete de recursos específica para la localización, y luego:

SimpleDateFormat sdf = (SimpleDateFormat)sdf.getDateTimeInstance(DateTime.SHORT,DateTime.SHORT, locale); 
if (formatString != null) { 
    sdf = new SimpleDateFormat(formatString); 
} 
if (am!= null && pm != null) { 
    DateFormatSymbols symbols = sdf.getDateFormatSymbols(); 
    symbols.setAmPmStrings(new String[]{am, pm}); 
    sdf.setDateFormatSymbols(symbols); 
} 

Pablo: no seguro de que hay un separador en los DateFormatSymbols, aunque ... así que probablemente necesite mantener el str.replace

0

Recomiendo usar Joda Time para el formato de su fecha. Tiene una flexibilidad poderosa pero elegante en su formateo. Probablemente descubrirá que sus formateadores hacen que lo que quiere hacer sea extremadamente simple.

BTW: una vez que vaya Joda, ¡nunca más volverá!

1

Java tiene una clase solo para esto, es la clase ResourceBundle. Back con un archivo de propiedades y tiene todo lo que necesita y más.

Incluso sin la clase ResourceBundle, puede usar los archivos properties para contener todos los formatos SimpleDateFormat.

Settings formats = new Settings(); 
Properties SDFFormats = formats.load(propertiesFile); 

String SDFAmerica = SDFFormats.getProperty("FormatAmerica"); 

Mientras que la entrada en el archivo de propiedades puede leer

FormatAmerica = MMM-dd-yyyy 
Cuestiones relacionadas