2010-08-31 4 views
2

Existe-t-il un moyen de faire du format DateFormat une date avec une année complète (par exemple 12/12/2010), en utilisant DateFormat.SHORT comme modèle? Je dois formater les dates dans en_US et da_DK.Java DateFormat.SHORT avec année complète

Je sais que je pourrais utiliser DateFormat.MEDIUM, mais la date doit être formatée en utilisant seulement des nombres et des séparateurs, et DateFormat.MEDIUM pour en_US produit quelque chose comme 'Dec 12, 2010'.

Répondre

3

Si les deux formats sont les mêmes, utilisez simplement:

DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy"); 

Si elles diffèrent:

private static Map<Locale, String> formats = new HashMap<Locale, String>(); 

static { 
    formats.put(new Locale("en_US"), "dd/MM/yyyy"); 
    formats.put(new Locale("da_DK"), "dd.MM.yyyy"); 
} 

Et puis au lieu d'utiliser DateFormat.getDateInstance(..) utilisation

new SimpleDateFormat(formats.get(locale)).format(..); 
+0

Ils diffèrent dans les séparateurs et les parties de mois et la date sont commutées. Mais j'aime cette solution! :) – ManiSto

+1

Existe-t-il une solution plus généralisée pour cela, en particulier dans les cas où vous voulez être capable de supporter * tous * les locales? – CloudyMusic

+0

@cloudymusic pouvez-vous analyser sans ambiguïté 8/9/10 dans tous les paramètres régionaux? Est-ce: le 10 septembre 2008? 8 septembre 2010? Le 9 août 2010? –

3

java.time

Vous pouvez utiliser les classes java.time qui supplantent les anciennes classes de date-heure. Au lieu de DateFormat, utilisez un DateTimeFormatter dérivé d'un DateTimeFormatterBuilder.

DateTimeFormatterBuilder peut fournir un motif qui peut être utilisé avec DateTimeFormatter. En utilisant String.replace vous pouvez insérer yyyy au lieu de yy dans le modèle de date FormatStyle.SHORT:

 String pattern = 
      DateTimeFormatterBuilder 
       .getLocalizedDateTimePattern 
        (FormatStyle.SHORT 
        , null 
        , IsoChronology.INSTANCE 
        , locale 
        ); 
     pattern = pattern.replace("yy", "yyyy"); 
     DateTimeFormatter dtf = 
      DateTimeFormatter.ofPattern(pattern); 
+0

Réponse intelligente. Le seul problème que je vois est qu'il suppose que pour tous les paramètres régionaux possibles, le style 'FormatStyle.SHORT' * utilise toujours deux chiffres pour l'année. Si l'on utilisait 4 chiffres, cette approche se briserait. –

+0

@BasilBourque L'utilisation de 'pattern.replace (" yyyy "," yy "). Replace (" yy "," yyyy ")' résoudra votre 'problème à 4 chiffres'. – irieill

+1

@irieill Doit également remplacer tout «u» et «y», le code de l'autre année. Merci! –