2017-02-16 4 views
4

でサポートされていないロケールを使用するには、アンティグア・バーブーダどのように国際化の一環として、Javaの

のようないくつかの国 をサポートするための要件を持っAG & ドミニカ共和国 - ISO3166コード -

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

Javaは日付をmm/dd/yyの形式で表示します。これらの国での日付形式はdd/mm/yyです。

パターンdd/mm/yyを達成する方法はありますか? ICU4J図書館でもこれらの国をサポートしていませんか?あなたが適切なサービスプロバイダインタフェース(SPI)に基づいて拡張を作成することにより、Javaランタイムに追加ロケールを追加することができ、事前

+1

正しいレイアウトで独自の 'DateFormat'を作らなければならないかもしれません。 –

+0

それはハードコーディングのようです。私は、さまざまな国の日付/通貨/数値書式パターンを渡すことができるXMLベースのアプローチを提供するオプションを探しています。 –

答えて

5

感謝。

あなたはアンティグアバーブーダ(en_AG)のための短い日付形式を指定したい場合たとえば、次のように、あなたはjava.text.spi.DateFormatProvider SPIを実装することができますが:

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

これは、JARファイルにパッケージ化する必要がありますJARのMETA-INF/servicesディレクトリには、java.text.spi.DateFormatProviderという名前のファイルを作成する必要があります。このファイルには、ちょうど私の場合には、プロバイダの完全修飾名が含まれている必要があります

EnAgDateFormatProvider 

あなたはJARを作成したら、あなたはJREの拡張ディレクトリにドロップする必要があります。私のUbuntuマシンでは、これは/usr/lib/jvm/java-8-oracle/jre/lib/ext/になります。その後

、あなたの質問からコードスニペット:

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

は、プリントアウトします:

Short format: 16/02/2017 

参考文献:

+0

フォーマットするコードは、DateTest.javaクラスにあります。 java -Djava.locale.providers = CLDR DateTestを呼び出すと、カスタムサービスプロバイダ(つまりdd/MM/yy)から日付形式を出力するのではなく、CLDR提供のパターンから印刷します –

1

これで面倒な古い日付時刻クラス、java.timeクラスに取って代わら遺産を、使用しています。

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

あなたがあなた自身を構築することができます:

アンティグア・バーブーダ

「アンティグア・バーブーダ - - ISO3166コードAGは」list of supported localesを参照してくださいまたはお電話のJava 8でサポートされているロケールないですサポートされていないロケールの明示的な書式設定パターンのリストたとえば、DateTimeFormatter.ofPattern("dd/MM/yy")です。

「en-AG」などの言語 - 国文字列を使用して、未定義の各ロケールのMapを同様の適切な形式の同じLocaleに定義してください。

各長さ(FULL、SHORTなど)のオブジェクトを返すメソッドで、未定義のロケールごとにEnumを定義するか、またはDateTimeFormatterのオブジェクトを返すメソッドを使用して、Enumを定義します。

Answer by Comelissenでも、私はそれをまだ十分に勉強していませんが、まだそれを推薦することはできません。

ドミニカ共和国

「ドミニカ共和国 - ISO3166コード - DO」は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:2017年2月16日は16/02/17

です

結果は、dd/MM/yyになります。 java.timeについて


java.timeフレームワークは、Java 8に組み込まれており、後にされています。これらのクラスは、java.util.DateCalendar、& SimpleDateFormatなど、面倒な古いlegacy日時クラスに取って代わります。

maintenance modeにあるJoda-Timeプロジェクトは、java.timeクラスへの移行を推奨しています。

Oracle Tutorialを参照して、詳細をご覧ください。そして、多くの例と説明のためにStack Overflowを検索してください。仕様はJSR 310です。

ここで、java.timeクラスを取得するには?

  • Java SE 8SE 9以降
    • 内蔵しています。
    • バンドルされた実装の標準Java APIの一部です。
    • Java 9には、いくつかのマイナーな機能と修正が加えられています。
  • Java SE 6SE 7
    • java.time機能の多くはThreeTen-BackportのJava 6 & 7に戻って、移植されます。
  • Android
      ThreeTenABP
    • プロジェクトは、具体的にはAndroid用(上記)ThreeTen-バックポートを適応させます。
    • How to use ThreeTenABP…を参照してください。

ThreeTen-Extraプロジェクトでは、追加のクラスでjava.timeを拡張します。このプロジェクトは、将来のjava.timeへの追加の可能性を証明する土台です。ここでは、IntervalYearWeekYearQuartermoreなどの便利なクラスがあります。