DateTimeFormatterBuilder#appendText(TemporalField, Map<Long,String>) 解析时抛出异常

DateTimeFormatterBuilder#appendText(TemporalField, Map<Long,String>) throws exception when parsing

我正在尝试使用 DateTimeFormatterBuilder#buildFormatter() 方法返回的 DateTimeFormatter 来解析代表 LocalDate 值和 IsoField.QUARTER_OF_YEAR 的文本。

有问题的文本是“2018 年 10 月 20 日第二季度”。季度值 ("Q2") 对于常规日历年来说是公认的不正确,此处为“2018”。但是,我正在处理一个于 6 月 30 日结束的财政年度,因此日期“2018 年 10 月 20 日”将在该财政年度的第二季度。

格式化程序使用以下代码构建:

TemporalQuery<LocalDate> query = LocalDate::from;
String pattern = “d MMM uuuu qqq”;
Locale locale = Locale.forLanguageTag("en-US");
TemporalField tf = IsoFields.QUARTER_OF_YEAR;
Map<Long, String> m = new Hashtable<>();
m.put(4L, “Q2”);
DateTimeFormatter formatter = new DateTimeFormatterBuilder()                                                                                
                                       .parseCaseInsensitive()
                                       .appendPattern(pattern)
                                       .appendText(tf, m)
                                       .toFormatter(locale);
TemporalAccessor value = formatter.parse(text, query)

尝试解析生成带有错误消息的 DateTimeParseException: “无法在索引 0 处解析文本‘2018 年 10 月 20 日第二季度’”

我试过更改 parseCaseInsensitive()appendText() 方法的调用顺序。尽管在其中一个变体中指定的索引为 14,但仍会抛出异常。

问题的可能原因: DateTimeFormatterBuilder#appendText(TemporalField, Map) 方法可能仅适用于格式操作,不适用于此处的解析。

提前感谢您的任何想法或帮助!

您尝试两次解析季度年部分 - 一次针对每个模式指令(使用字母 q),一次针对每个构建器指令(使用方法 appendText)。解决方案:删除模式中的 qqq 部分并 使用 "d MMM uuuu ".

但是有些评论:

  • 完全不支持会计年度。
  • 使用更好的 HashMap 而不是过时的 Hashtable
  • 示例代码有特殊的引号而不是标准的 char (")。
  • 解析后的值等同于LocalDate.of(2018, 10, 20)(没有关于您的特殊宿舍的信息)。