我正在尝试使用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)方法只能在格式操作中使用,而不能在此处进行解析。
在此先感谢您的任何想法或帮助!
答案 0 :(得分:2)
您尝试两次解析四分之一年份部分-每个模式指令一次(使用字母q)一次,每个构建者指令一次(使用方法appendText)一次。解决方案:删除模式中的qqq-part,然后使用“ d MMM uuuu” 。
但是有一些评论:
HashMap
而不是过时的Hashtable
。LocalDate.of(2018, 10, 20)
(并且没有关于您的特殊季度的信息)。