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)
(没有关于您的特殊宿舍的信息)。
我正在尝试使用 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)
(没有关于您的特殊宿舍的信息)。