【发布时间】:2017-07-13 13:47:26
【问题描述】:
我创建了一个实现java.time.temporal.TemporalField 的CENTURY 字段 - 这个问题没有关注该字段的正确实现细节(稍后将处理),我对@987654324 感兴趣@问题如下所述。
基本上,该字段获取一个时间对象的ChronoField.YEAR,并使用这个值来计算世纪(计算是在getFrom(TemporalAccessor temporal)方法中进行的,考虑到1st世纪是从第 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
上面的输出是:
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。
我正在尝试找到一种为此字段添加自定义本地化字符串的方法,例如添加月份和星期几(假设我已经设置了资源包属性文件)。
检查源代码,我发现格式化程序内部使用TextPrinterParser,而后者又使用DateTimeTextProvider 来获取本地化字符串,但是这些类都不是公共的,不能使用也不能使用扩展。而且 API 似乎没有提供为新字段添加自定义本地化字符串的方法。
我只能通过使用反射和java.lang.reflect.Proxy 覆盖TextPrinterParser 的行为来做到这一点,但我想知道是否有更好的方法(不需要所有这些“魔法”)。
如何做到这一点(如果可能)?
我知道我也可以使用 appendText(TemporalField field, Map<Long,String> textLookup),但这不是“区域敏感”解决方案(尽管它似乎是可用的最佳解决方法)。
【问题讨论】:
标签: localization java-8 datetime-format java-time