我创建了一个CENTURY
字段来实现java.time.temporal.TemporalField
- 这个问题并不关注这个字段的正确实现细节(稍后会处理),我很感兴趣在DateTimeFormatter
问题中,如下所述。
基本上,该字段获取时间对象的ChronoField.YEAR
并使用此值来计算世纪(计算是在getFrom(TemporalAccessor temporal)
方法中进行的,考虑到1 st 世纪是从第1年到第100年 - 但正如我所说,让我们在这些细节中不要太过分了。)
最基本的用法是:
LocalDate.of(2017, 1, 1).get(CENTURY); // 21
在这种情况下返回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
以上的输出是:
01/01/2017 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
。
我正在尝试找到一种方法来为这个字段添加自定义本地化字符串,例如它用月份和星期几来完成(让我们假设我已经设置了资源包属性文件)。
检查源代码,我发现格式化程序在内部使用TextPrinterParser
,后者又使用DateTimeTextProvider
来获取本地化字符串,但这些类都不是公共的,可以'使用也不延长。并且API似乎没有提供为新字段添加自定义本地化字符串的方法。
我只能通过使用反射和java.lang.reflect.Proxy
来覆盖TextPrinterParser
的行为,但我想知道是否有更好的方法(不需要所有这些“魔法”)
如何做到这一点(如果可能的话)?
我知道我也可以使用appendText(TemporalField field, Map<Long,String> textLookup)
,但这不是“区域敏感”解决方案(尽管它似乎是最好的解决方法)。
答案 0 :(得分:3)
今天java.time.*
无法做到这一点。 DateTimeTextProvider
类旨在是可扩展的,但是在开发过程中它被描述了。提供可插入的文本提供程序将是对Java的有用增强。