2010-08-15 21 views
6

Est-il possible de récupérer un modèle par défaut pour un environnement local donné, sans convertir un objet renvoyé par DateFormat.get*Instance() en SimpleDateFormat? Je comprends que dans la plupart des cas, tout ira bien, mais il y a une note dans javadoc, here: "Si vous voulez encore plus de contrôle sur le format ou l'analyse, (ou si vous voulez donner plus de contrôle à vos utilisateurs), vous pouvez essayer de couler le DateFormat vous obtenez des méthodes d'usine à un SimpleDateFormat.Cela fonctionnera pour la majorité des pays, souvenez-vous simplement de le mettre dans un bloc try au cas où vous rencontrez un inhabituel. "Existe-t-il un autre moyen de récupérer le modèle par défaut pour un environnement local donné?

Donc, je me demande, que dois-je faire dans le cas où je "rencontrer un inhabituel"?

Related theme.

Exemple de code:

/** 
* Returns '\n'-separated string with available patterns. 
* Optional adds appropriate language code to each pattern string. 
* 
* @param showLanguage Defines if language info is required. 
* @return String with available patterns, optional (if showLanguage is set 
* to "true") adds appropriate language code to each pattern. 
*/ 
public String getPatternsForAvailableLocales(Boolean... showLanguage) { 

    /* Array of available locales */ 
    Locale[] locales = DateFormat.getAvailableLocales(); 

    String result = ""; 

    for (Locale locale : locales) { 

     /* Add language info, if necessary */ 
     if ((showLanguage.length > 0) && (showLanguage[0])) { 
      result += locale.getLanguage() + '\t'; 
     } 

     /* Retrieving pattern */ 
     try { 
      result += ((SimpleDateFormat) 
        DateFormat.getDateTimeInstance(DateFormat.SHORT, 
          DateFormat.SHORT, locale)).toPattern(); 
     } catch (ClassCastException e) { 
      // ******************************** // 
      // What's up? Is there another way? // 
      // ******************************** // 
     } 

     result += '\n'; 

    } 
    return result; 
} 
+0

Je ne suis pas sûr si vous pouvez faire quelque chose si vous "rencontrez un inhabituel", car il peut ne pas être basé sur un modèle. Surtout parce qu'un développeur peut fournir son propre 'DateFormat' via' java.text.spi.DateFormatProvider'. –

Répondre

1

Vous pouvez récupérer les symboles de format de date pour une langue particulière en exécutant le code Java suivant:

System.out.println(DateFormatSymbols.getInstance 
     (new Locale("en_US")).getLocalPatternChars()); 
System.out.println(DateFormatSymbols.getInstance 
     (new Locale("nl_NL")).getLocalPatternChars()); 

Dans ce cas particulier, le néerlandais, les symboles de format de date sont les mêmes.

GyMdkHmsSEDFwWahKzZ 
GyMdkHmsSEDFwWahKzZ 

Dans le cas où les symboles de la langue étrangère sont différents, vous substituer le caractère de langue étrangère pour le caractère anglais dans la chaîne de format simple. La classe DateFormatSymbols existe depuis au moins Java 1.4.2.

2

Le modèle lui-même est unique à SimpleDateFormat qui est la raison pour laquelle vous le jeter.

Si vous trouvez un DateFormat qui n'est pas SimpleDateFormat, vous voulez enregistrer l'exception, en enregistrant la classe de l'implémentation réelle, et à ce stade, vous aurez suffisamment d'informations pour décider comment gérer la situation. Pour l'instant, comme il n'y a pas de modèle, n'ajoutez pas celui-ci à la liste des résultats s'il n'est pas SimpleDateFormat.

Si je peux demander, pourquoi renvoyez-vous une chaîne concaténée au lieu d'une collection de chaînes? Il semble qu'il serait plus facile de faire défiler vos résultats. Si la chaîne concaténée est essentielle, utilisez StringBuilder pour la construire car vous créerez moins d'objets et améliorerez les performances. C'est une bonne habitude d'être en train de construire des cordes en boucle.

+0

Merci pour votre réponse. Bien que vous n'ayez pas fourni de réponse directe à une question concrète, vous avez suggéré une solution harmonieuse pour gérer cette situation possible (comme le montre la pratique très peu probable, mais possible). Je pense donc que votre réponse pourrait être acceptée comme une solution. – Milkywayfarer

+0

Plus de thx pour vos commentaires sur le code.Répondre à vos questions: – Milkywayfarer

+0

1) oui, je suis d'accord que l'utilisation de la collecte de chaînes serait plus pratique, mais ce n'était que du code démonstratif pour clarifier ce qui était question. – Milkywayfarer