2017-07-13 1 views
1

-を実装するCENTURYフィールドを作成しました。この問題は、このフィールドの正しい実装の詳細(後で扱います)以下に説明するDateTimeFormatter号に興味があります新しいカスタムTemporalFieldのカスタムローカライズされたテキストを追加します。

基本的には、フィールドは(計算が1 ST世紀は年1〜100であることを考慮すると、getFrom(TemporalAccessor temporal)方法で作られている一時的なオブジェクトのChronoField.YEARを取得し、世紀を計算し、この値を使用しています - しかし、私として言った、これらの詳細にあまりにも多くのことをしないでください)。

最も基本的な使い方は次のとおりです。

この場合には 21を返し
LocalDate.of(2017, 1, 1).get(CENTURY); // 21 

フィールドもDateTimeFormatterで使用することができる。

DateTimeFormatter fmt = new DateTimeFormatterBuilder() 
    .appendPattern("dd/MM/yyyy ") 
    .appendValue(CENTURY) 
    .toFormatter(); 

System.out.println(fmt.format(LocalDate.of(2017, 1, 1))); // 01/01/2017 21 

上記の出力がある:

2017年1月1日21


しかし私がしたいのは、このフィールドにカスタムローカライズされたテキストを使用することです。私はこのようなフォーマッター作成する場合:

DateTimeFormatter fmt = new DateTimeFormatterBuilder() 
    .appendPattern("dd/MM/yyyy ") 
    // century text 
    .appendText(CENTURY, TextStyle.SHORT) 
    // use English locale 
    .toFormatter(Locale.ENGLISH); 

System.out.println(fmt.format(LocalDate.of(2017, 1, 1))); // 01/01/2017 21 

を私の新しいCENTURYフィールドにはローカライズされたデータがありませんので、テキストだけで、独自の値21です。

私はこのフィールドにカスタムのローカライズされた文字列を追加する方法を見つけようとしています。たとえば、月や曜日で行われているように(たとえば、すでにリソースバンドルのプロパティファイルが設定されていると仮定します)。

フォーマッタは内部的にを使用していますが、これはDateTimeTextProviderを使用してローカライズされた文字列を取得しますが、それらのクラスは公開されておらず、使用も拡張もできません。 APIは新しいフィールドにカスタムのローカライズされた文字列を追加する方法を提供していないようです。

私は、反射とjava.lang.reflect.Proxyの動作を上書きするだけで、TextPrinterParserの動作を上書きできますが、もっと良い方法があるかどうかは疑問です。

これはどのように(可能な場合)できますか?


私はまたappendText(TemporalField field, Map<Long,String> textLookup)を使用することができます知っているが、(利用可能な最善の回避策のようですが)それは、「ロケールに敏感な」解決策ではないでしょう。

答えて

3

今日はjava.time.*では実行できません。 DateTimeTextProviderクラスは拡張可能であることが意図されていましたが、これは開発中に解読されました。プラグ可能なテキストプロバイダを提供することは、Javaの便利な拡張になります。

関連する問題