【发布时间】:2019-12-20 02:06:59
【问题描述】:
我正在尝试将格式为“YYYYww”(例如 201901)的简单字符串解析为 LocalDate,但我的尝试都没有成功。
我尝试通过简单地使用模式“YYYYww”以及手动将值附加到 FormatterBuilder 来解析它。 由于我的输入字符串不包含一天,我还将格式化程序配置为默认为星期日。
下面是运行 Java 8 (IBM JRE 8.0.5.25) 时对我来说失败的代码。
public static void main(String[] args) {
formatter1(); // Unable to obtain LocalDate from TemporalAccessor
formatter2(); // Text '201901' could not be parsed at index 0
formatter3(); // Text '201901' could not be parsed at index 6
}
public static void formatter1() {
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendValue(WeekFields.ISO.weekBasedYear(), 4, 4, SignStyle.NEVER)
.appendValue(WeekFields.ISO.weekOfYear(), 2, 2, SignStyle.NEVER)
.parseDefaulting(WeekFields.ISO.dayOfWeek(), DayOfWeek.SUNDAY.getValue())
.toFormatter();
LocalDate.parse("201901", formatter);
}
public static void formatter2() {
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendPattern("YYYYww")
.parseDefaulting(WeekFields.ISO.dayOfWeek(), DayOfWeek.SUNDAY.getValue())
.toFormatter();
LocalDate.parse("201901", formatter);
}
public static void formatter3() {
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.parseLenient()
.appendPattern("YYYYww")
.parseDefaulting(WeekFields.ISO.dayOfWeek(), DayOfWeek.SUNDAY.getValue())
.toFormatter();
LocalDate.parse("201901", formatter);
}
从示例代码中可以看出,我收到了不同的错误消息,尤其是第一个示例让我感到困惑,因为 TemporalAccessor 包含基于周的年份、一年中的星期和工作日,这应该足以构造一个 LocalDate。
Exception in thread "main" java.time.format.DateTimeParseException: Text '201901' could not be parsed: Unable to obtain LocalDate from TemporalAccessor: {WeekOfYear[WeekFields[MONDAY,4]]=1, WeekBasedYear[WeekFields[MONDAY,4]]=2019, DayOfWeek=7},ISO of type java.time.format.Parsed
at java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:1931)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1866)
at java.time.LocalDate.parse(LocalDate.java:411)
at Main.formatter1(Main.java:22)
at Main.main(Main.java:10)
Caused by: java.time.DateTimeException: Unable to obtain LocalDate from TemporalAccessor: {WeekOfYear[WeekFields[MONDAY,4]]=1, WeekBasedYear[WeekFields[MONDAY,4]]=2019, DayOfWeek=7},ISO of type java.time.format.Parsed
at java.time.LocalDate.from(LocalDate.java:379)
at java.time.LocalDate$$Lambda$7.000000001061ED20.queryFrom(Unknown Source)
at java.time.format.Parsed.query(Parsed.java:237)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1862)
... 3 more
【问题讨论】:
-
顺便说一句,调试此类事情的一个小而有用的技巧。正在调用
TemporalAccessor a = formatter.parse("...");,这样你就可以在这一步之间进行,而且更容易理解为什么事情会发生这样的事情:) -
我无法复制。您的方法
formatter2和formatter3在我的Java 11 上都能完美运行。要让formatter1正常工作,只需将WeekFields.ISO.weekOfYear()替换为WeekFields.ISO.weekOfWeekBasedYear() -
@OleV.V.抱歉,我在 Java 8 (IBM) 上运行
-
我已在 (Oracle) Java 1.8.0_101 上复制。
formatter2()抛出java.time.format.DateTimeParseException: Text '201901' could not be parsed at index 0。formatter3()改为抛出java.time.format.DateTimeParseException: Text '201901' could not be parsed at index 6。我觉得这很有趣,无法立即解释。 (在问题中添加您的 Java 版本将使我能够收回我的反对票。) -
非常有趣,所以它似乎已在较新版本的 Java 中得到修复。感谢您的确认,我已在问题中添加了我的版本。