在DateTimeFormatter中添加自定义本地化文本,用于新的自定义TemporalField

时间:2017-07-13 13:47:27

标签: localization java-8 datetime-format java-time

我创建了一个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),但这不是“区域敏感”解决方案(尽管它似乎是最好的解决方法)。

1 个答案:

答案 0 :(得分:3)

今天java.time.*无法做到这一点。 DateTimeTextProvider类旨在是可扩展的,但是在开发过程中它被描述了。提供可插入的文本提供程序将是对Java的有用增强。