【问题标题】:Add custom localized text in DateTimeFormatter, for a new custom TemporalField在 DateTimeFormatter 中添加自定义本地化文本,用于新的自定义 TemporalField
【发布时间】:2017-07-13 13:47:26
【问题描述】:

我创建了一个实现java.time.temporal.TemporalFieldCENTURY 字段 - 这个问题没有关注该字段的正确实现细节(稍后将处理),我对@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


    【解决方案1】:

    这在今天的java.time.* 中是不可能的。 DateTimeTextProvider 类原本是可扩展的,但在开发过程中被取消了。提供可插入的文本提供程序将是对 Java 的有用增强。

    【讨论】:

      猜你喜欢
      • 2016-11-25
      • 1970-01-01
      • 1970-01-01
      • 2020-12-12
      • 1970-01-01
      • 2023-02-13
      • 1970-01-01
      • 2010-09-23
      • 2021-09-10
      相关资源
      最近更新 更多