2008-10-21 5 views
5

Création d'une application Java prenant en charge différents environnements régionaux, mais souhaitant personnaliser l'affichage DateFormat au-delà de ce qui est disponible entre les options FULL, LONG, MEDIUM et SHORT DateFormat. Voudrait faire des choses comme placer un caractère entre les composants date et heure d'un DateFormat.getDateTimeFormat(), en minuscule AM ​​/ PM, etc, au moins pour l'anglais.Personnalisation des formateurs java.text pour différents environnements locaux

peut penser à 3 façons de le faire:

1) Si locale est l'anglais, utilisez ma chaîne de format personnalisé sur un nouvel objet SimpleDateFormat.

2) modifier les chaînes de format par défaut pour les paramètres régionaux existants

3) créer une nouvelle variante de locale qui spécifie les chaînes de format Je veux

ne peux pas comprendre comment faire 2 ou 3 (ou si c'est même possible), et préfèrerais ne pas faire 1 ... quelqu'un a-t-il déjà fait face à quelque chose comme ça?

aussi, semble que 2 ou 3 serait nécessaire pour les minuscules AM/PM? (La spécification de la ressource AmPmMarkers pour les paramètres dateformat)

Répondre

0

La seule chose similaire que j'ai traitée est le fait que "strftime" et "locale" disent que l'italien devrait utiliser des deux-points entre les champs de temps, mais Java met plein -arrête entre eux. J'ai donc ajouté le code suivant:

// 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

Pourquoi ne pas utiliser un MessageFormat à la place? Utilisez le modèle "{0, date, short} votre texte ici {0, time, short}" pour faire ce que vous voulez.

+2

parce que parfois il devrait être "{0, temps, court} votre texte ici {0, date, court}", selon la lieu. –

0

La façon la plus satisfaisante pour résoudre ce que nous avons compris est de charger am Strings, pm, formatString à partir d'un ensemble de ressources spécifiques aux paramètres régionaux, puis:

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); 
} 

Paul: pas sûr qu'il ya un séparateur dans le DateFormatSymbols, cependant ... donc vous devez probablement garder le str.replace

0

Je recommande d'utiliser Joda Time pour le formatage de votre date. Il a une flexibilité puissante mais élégante dans son formatage. Vous trouverez probablement que ses formateurs font ce que vous voulez faire extrêmement simple.

BTW: une fois que vous allez Joda vous ne reviendrez jamais!

1

Java a une classe juste pour cela, c'est la classe ResourceBundle. Back avec un fichier de propriétés et vous avez tout ce dont vous avez besoin plus plus.

Même sans la classe ResourceBundle, vous pouvez utiliser les fichiers properties pour contenir tous les formats SimpleDateFormat.

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

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

Alors que l'entrée dans le fichier de propriétés peut lire

FormatAmerica = MMM-dd-yyyy 
Questions connexes