2017-02-16 1 views
4

Dans le cadre de Internationalisation, a obtenu une obligation de soutenir quelques pays commeComment utiliser Locale non pris en charge en Java

Antigua-et-Barbuda - Code ISO3166 - AG & République Dominicaine - Code ISO3166 - DO

Locale loc = new Locale("en", "AG"); 
    DateFormat df1 = DateFormat.getDateInstance(DateFormat.SHORT, loc); 
    System.out.println("Short format: " + df1.format(new Date())); 

Java affichera la date au format mm/jj/aa, où le format de date dans ces pays est jj/mm/aa.

Y a-t-il un moyen d'atteindre le modèle jj/mm/aa? Même les bibliothèques ICU4J ne supportent pas ces pays?

Merci à l'avance

+1

Vous devrez peut-être créer votre propre 'DateFormat' avec la disposition correcte. –

+0

Ensuite, c'est comme un codage dur. Je cherche une option pour fournir une approche basée sur XML qui peut passer le modèle de format de date/devise/nombre pour différents pays –

Répondre

5

Vous pouvez ajouter d'autres locales à l'exécution Java en créant une extension basée sur l'interface de fournisseur de services approprié (SPI).

Par exemple, si vous vouliez spécifier le format de date courte pour Antigua-et-Barbuda (en_AG), vous pouvez mettre en œuvre le java.text.spi.DateFormatProvider SPI comme suit:

import java.text.DateFormat; 
import java.text.SimpleDateFormat; 
import java.text.spi.DateFormatProvider; 
import java.util.Locale; 

public class EnAgDateFormatProvider extends DateFormatProvider { 
    private static final Locale EN_AG_LOCALE = new Locale("en", "AG"); 

    public DateFormat getDateInstance(int style, Locale locale) { 
     // if your extension supports multiple locales, you have to take the locale 
     // parameter into account as well 
     switch (style) { 
      case DateFormat.SHORT: 
       return new SimpleDateFormat("dd/MM/yy"); 

      default: 
       // TODO implement other styles 
       return null; 
     } 
    } 

    public DateFormat getTimeInstance(int style, Locale locale) { 
     // TODO implement this method 
     return null; 
    } 

    public DateFormat getDateTimeInstance(int dateStyle, int timeStyle, 
      Locale locale) { 

     // TODO implement this method 
     return null; 
    } 

    public Locale[] getAvailableLocales() { 
     return new Locale[]{EN_AG_LOCALE}; 
    } 
} 

Cela devra être emballé dans un fichier JAR et dans le répertoire META-INF/services du fichier JAR, vous devez créer un fichier nommé java.text.spi.DateFormatProvider. Ce fichier doit contenir le nom complet de votre fournisseur, dans mon cas seulement:

EnAgDateFormatProvider 

Une fois que vous avez créé le JAR, vous devez le déposer dans le répertoire des extensions de votre JRE. Sur ma machine Ubuntu, il s'agit de /usr/lib/jvm/java-8-oracle/jre/lib/ext/.

Après cela, l'extrait de code de votre question:

Locale loc = new Locale("en", "AG"); 
DateFormat df1 = DateFormat.getDateInstance(DateFormat.SHORT, loc); 
System.out.println("Short format: " + df1.format(new Date())); 

imprimera:

Short format: 16/02/2017 

Références:

+0

Supposer comme le code au format Date est dans une classe DateTest.java. Si nous appelons java -Djava.locale.providers = CLDR DateTest, il n'imprimera pas le format de date du fournisseur de service personnalisé (c'est-à-dire jj/MM/aa) à la place imprime à partir du modèle fourni par CLDR. –

1

Vous utilisez les classes date de temps anciens gênants, héritage aujourd'hui, supplanté par les classes java.time.

Antigua-et-Barbuda

« Antigua-et-Barbuda - Code ISO3166 - AG » est pas un lieu pris en charge en Java 8. Voir la list of supported locales ou appelez:

System.out.println ("locales: " + Arrays.toString (Locale.getAvailableLocales())); 

Vous pouvez construire votre propre liste des modèles de mise en forme explicites pour ces paramètres régionaux non pris en charge. Par exemple, DateTimeFormatter.ofPattern("dd/MM/yy").Mieux encore, définissez un Map de chaque langue locale non définie en utilisant la chaîne de langue de pays telle que "en-AG" à Locale similaire qui utilise les mêmes formats appropriés.

Ou de définir un Enum pour chaque environnement local non défini avec des méthodes qui renvoient DateTimeFormatter objets pour chaque longueur (FULL, SHORT, etc.).

Ou considérez le Answer by Comelissen, bien que je n'ai pas étudié assez bien pour le recommander encore.

République Dominicaine

« République Dominicaine - Code ISO3166 - DO » est pris en charge en Java 8.

Locale locale = new Locale ("es" , "DO"); // Spanish in Dominican Republic. 
LocalDate localDate = LocalDate.now (ZoneId.of ("Europe/Paris")); 
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate (FormatStyle.SHORT).withLocale (locale); 
String output = localDate.format (f); 

System.out.println ("localDate: " + localDate + " is " + output); 

LOCALDATE: 16/02/2017 est 16/02/17

Le résultat est comme vous le souhaitez, jj/mm/aa.


A propos java.time

Le cadre java.time est construit en Java 8 et versions ultérieures. Ces classes supplantent les vieilles classes de date-heure legacy gênantes telles que java.util.Date, Calendar, & SimpleDateFormat. Le projet Joda-Time, maintenant en maintenance mode, conseille la migration vers les classes java.time.

Pour en savoir plus, voir le Oracle Tutorial. Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310.

Où obtenir les classes java.time?

  • Java SE 8 et SE 9 et plus tard
    • intégré.
    • Partie de l'API Java standard avec une implémentation groupée.
    • Java 9 ajoute quelques fonctionnalités et corrections mineures.
  • Java SE 6 et SE 7
    • Une grande partie de la fonctionnalité de java.time est de retour à Java 6 Ported .
  • Android

Le projet ThreeTen-Extra java.time étend avec des classes supplémentaires. Ce projet est un terrain d'essai pour d'éventuels ajouts futurs à java.time. Vous pouvez trouver ici des classes utiles telles que Interval, YearWeek, YearQuarter et more.