首页 > 解决方案 > DateTimeFormatterBuilder#appendText(TemporalField, Map) 解析时抛出异常

问题描述

我正在尝试使用该方法返回的a 来解析表示LocalDate值的文本。IsoField.QUARTER_OF_YEARDateTimeFormatterDateTimeFormatterBuilder#buildFormatter()

有问题的文本是“2018 年 10 月 20 日 Q2”。对于传统日历年(此处为“2018”),季度值(“Q2”)无疑是不正确的。但是,我正在处理一个于 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错误消息:“Text '20 Oct 2018 Q2' could not be parsed at index 0”</p>

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

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

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

标签: javajava-timedate-parsinglocaldate

解决方案


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

然而,一些评论:

  • 根本不支持会计年度。
  • 使用更好HashMap的而不是过时的Hashtable.
  • 示例代码使用特殊引号代替标准字符 (")。
  • 解析的值相当于LocalDate.of(2018, 10, 20)(并且没有关于您的特殊宿舍的信息)。

推荐阅读