java - DateTimeFormatterBuilder#appendText(TemporalField, Map) 解析时抛出异常
问题描述
我正在尝试使用该方法返回的a 来解析表示LocalDate
值的文本。IsoField.QUARTER_OF_YEAR
DateTimeFormatter
DateTimeFormatterBuilder#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) 方法可能仅适用于格式操作,而不适用于此处的解析。
提前感谢您的任何想法或帮助!
解决方案
您尝试解析季度部分两次 - 每个模式指令一次(使用字母 q)和每个构建器指令一次(使用方法 appendText)。解决方案:删除你的模式中的 qqq-part 并使用 "d MMM uuuu"。
然而,一些评论:
- 根本不支持会计年度。
- 使用更好
HashMap
的而不是过时的Hashtable
. - 示例代码使用特殊引号代替标准字符 (")。
- 解析的值相当于
LocalDate.of(2018, 10, 20)
(并且没有关于您的特殊宿舍的信息)。
推荐阅读
- javascript - 如何在asp.net中使用javascript调用是或否警告框?
- java - 为什么当我们通过使用 hibernate 5.3.1.Final 依赖项启用 hibernate.cfg.xml 文件中的查询缓存时会出现异常?
- debugging - exec.Command 无法在调试模式下运行
- java - 基于递归定义的函数实现
- javascript - 禁用输入字段的前缀搜索
- cmd - NSIS 运行时 CMD,路径和参数中有空格
- python - 尝试将数据帧与分类数据连接时出现意外错误
- reactjs - 如何从反应中的材料选择下拉列表中获取值
- python - Python argparse 多个元变量名称
- php - PHP 检查 URL 并打印默认参数