-を実装する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)
を使用することができます知っているが、(利用可能な最善の回避策のようですが)それは、「ロケールに敏感な」解決策ではないでしょう。