DateTimeFormatterBuilder#appendText(TemporalField,Map <long,string>)解析时引发异常

时间:2018-10-20 10:23:22

标签: java java-time date-parsing localdate

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

有问题的文字是“ 2018年10月20日第二季度”。对于传统日历年(此处为“ 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: “无法在索引0处解析文本'2018年10月20日第二季度'”

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

可能的问题原因: DateTimeFormatterBuilder#appendText(TemporalField,Map)方法只能在格式操作中使用,而不能在此处进行解析。

在此先感谢您的任何想法或帮助!

1 个答案:

答案 0 :(得分:2)

您尝试两次解析四分之一年份部分-每个模式指令一次(使用字母q)一次,每个构建者指令一次(使用方法appendText)一次。解决方案:删除模式中的qqq-part,然后使用“ d MMM uuuu”

但是有一些评论:

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