【发布时间】:2017-01-02 04:02:50
【问题描述】:
DateTimeFormatter.ofPattern 生成的解析器表现出以下有趣的行为,这使我无法编写模式来解析像 20150100 这样的字符串:
System.out.println(DateTimeFormatter.ofPattern("yyyyMM").parse("201501", YearMonth::from)); // works
System.out.println(DateTimeFormatter.ofPattern("yyyyMM'aa'").parse("201501aa", YearMonth::from)); // works
System.out.println(DateTimeFormatter.ofPattern("yyyyMM'00'").parse("20150100", YearMonth::from));
// java.time.format.DateTimeParseException: Text '20150100' could not be parsed at index 0
我调试了代码,似乎问题是由超出字符串末尾的年份字段解析引起的(三个 y 和更多的最大宽度始终为 19)。但是,我不明白如果最后没有 '00' 文字,它如何适用于该模式。
有什么办法可以解决这个不得不使用格式化程序生成器的问题?
编辑:
由于下面的 Jarrod 确认它有问题,我做了更多的谷歌搜索,终于找到了错误报告:
http://bugs.java.com/bugdatabase/view_bug.do?bug_id=8031085
http://bugs.java.com/bugdatabase/view_bug.do?bug_id=8032491
不过,两者都只在 Java 9 中修复......
【问题讨论】:
-
为什么不想使用格式化程序生成器?
-
你试过单步调试看看有什么区别吗?
-
@Tunaki 因为这是一个简单的案例,像
SimpleDateFormat这样的旧工具支持,而且这种行为看起来更像是一个错误...... -
SimpleDateFormat也以同样的方式失败,因为它们都依赖于DateTimeFormatter,这就是错误所在。 -
@Tunaki 事实证明这个案例在构建器中也有问题......请参阅第二个错误链接。