Java 8 中的 DateTimeFormatterBuilder 用法,特别是可选项
DateTimeFormatterBuilder usages in Java 8, specifically optionals
我正在尝试从 Joda 转移到 Java 8 的 ZonedDateTime
,但我遇到了似乎无法解决的 DateTimeFormatterBuilder
问题。
我想接受以下任何一种格式:
2013-09-20T07:00:33
2013-09-20T07:00:33.123
2013-09-20T07:00:33.123+0000
2013-09-20T07:00:33.123Z
2013-09-20T07:00:33.123Z+0000
2013-09-20T07:00:33+0000
这是我当前的构建器:
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.parseCaseInsensitive()
.append(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
.optionalStart()
.appendPattern(".SSS")
.optionalEnd()
.optionalStart()
.appendZoneId()
.optionalEnd()
.optionalStart()
.appendPattern("Z")
.optionalEnd()
.toFormatter();
我可能错了,但看起来应该符合我想要的模式...对吗?
如果有人能指出我可能遗漏的内容,我们将不胜感激。我也不太确定 appendOffset
的使用,所以如果它最终成为答案,我也很感激。
编辑:
Text '2013-09-20T07:00:33.061+0000' could not be parsed at index 23
查看生成器,由于可选阶段,这似乎匹配?
编辑 2:
在看到第一个答案的建议后,我尝试了这个:
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.parseCaseInsensitive()
.append(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
.optionalStart()
.appendPattern(".SSS")
.optionalEnd()
.optionalStart()
.appendZoneOrOffsetId()
.optionalEnd()
.toFormatter()
上面的字符串继续失败。
编辑 3:
最新测试导致此异常:
java.time.format.DateTimeParseException: Text '2013-09-20T07:00:33.061+0000' could not be parsed at index 23
at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1947)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1849)
at java.time.ZonedDateTime.parse(ZonedDateTime.java:597)
at java.time.ZonedDateTime.parse(ZonedDateTime.java:582)
可能是因为+0000
不是zone id,而是zone offset
documentation 提供此列表:
Symbol Meaning Presentation Examples
------ ------- ------------ -------
V time-zone ID zone-id America/Los_Angeles; Z; -08:30
z time-zone name zone-name Pacific Standard Time; PST
O localized zone-offset offset-O GMT+8; GMT+08:00; UTC-08:00;
X zone-offset 'Z' for zero offset-X Z; -08; -0830; -08:30; -083015; -08:30:15;
x zone-offset offset-x +0000; -08; -0830; -08:30; -083015; -08:30:15;
Z zone-offset offset-Z +0000; -0800; -08:00;
您可以使用 appendOffset("+HHMM", "0000")
(doc) or appendZoneOrOffsetId()
(doc) 而不是 appendZoneId()
。
因此您的完整格式化程序可能如下所示
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.parseCaseInsensitive()
.append(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
.optionalStart()
.appendPattern(".SSS")
.optionalEnd()
.optionalStart()
.appendZoneOrOffsetId()
.optionalEnd()
.optionalStart()
.appendOffset("+HHMM", "0000")
.optionalEnd()
.toFormatter();
此外,创建 ZonedDateTime 的方式可能会影响是否存在异常。因此,我推荐以下内容,因为它无一例外地有效。
LocalDateTime time = LocalDateTime.parse("2013-09-20T07:00:33.123+0000", formatter);
ZonedDateTime zonedTime = time.atZone(ZoneId.systemDefault());
你试过了吗.appendPattern("ZZZ")
?它可能会起作用!
我正在尝试从 Joda 转移到 Java 8 的 ZonedDateTime
,但我遇到了似乎无法解决的 DateTimeFormatterBuilder
问题。
我想接受以下任何一种格式:
2013-09-20T07:00:33
2013-09-20T07:00:33.123
2013-09-20T07:00:33.123+0000
2013-09-20T07:00:33.123Z
2013-09-20T07:00:33.123Z+0000
2013-09-20T07:00:33+0000
这是我当前的构建器:
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.parseCaseInsensitive()
.append(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
.optionalStart()
.appendPattern(".SSS")
.optionalEnd()
.optionalStart()
.appendZoneId()
.optionalEnd()
.optionalStart()
.appendPattern("Z")
.optionalEnd()
.toFormatter();
我可能错了,但看起来应该符合我想要的模式...对吗?
如果有人能指出我可能遗漏的内容,我们将不胜感激。我也不太确定 appendOffset
的使用,所以如果它最终成为答案,我也很感激。
编辑:
Text '2013-09-20T07:00:33.061+0000' could not be parsed at index 23
查看生成器,由于可选阶段,这似乎匹配?
编辑 2:
在看到第一个答案的建议后,我尝试了这个:
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.parseCaseInsensitive()
.append(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
.optionalStart()
.appendPattern(".SSS")
.optionalEnd()
.optionalStart()
.appendZoneOrOffsetId()
.optionalEnd()
.toFormatter()
上面的字符串继续失败。
编辑 3:
最新测试导致此异常:
java.time.format.DateTimeParseException: Text '2013-09-20T07:00:33.061+0000' could not be parsed at index 23
at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1947)
at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1849)
at java.time.ZonedDateTime.parse(ZonedDateTime.java:597)
at java.time.ZonedDateTime.parse(ZonedDateTime.java:582)
可能是因为+0000
不是zone id,而是zone offset
documentation 提供此列表:
Symbol Meaning Presentation Examples
------ ------- ------------ -------
V time-zone ID zone-id America/Los_Angeles; Z; -08:30
z time-zone name zone-name Pacific Standard Time; PST
O localized zone-offset offset-O GMT+8; GMT+08:00; UTC-08:00;
X zone-offset 'Z' for zero offset-X Z; -08; -0830; -08:30; -083015; -08:30:15;
x zone-offset offset-x +0000; -08; -0830; -08:30; -083015; -08:30:15;
Z zone-offset offset-Z +0000; -0800; -08:00;
您可以使用 appendOffset("+HHMM", "0000")
(doc) or appendZoneOrOffsetId()
(doc) 而不是 appendZoneId()
。
因此您的完整格式化程序可能如下所示
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.parseCaseInsensitive()
.append(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
.optionalStart()
.appendPattern(".SSS")
.optionalEnd()
.optionalStart()
.appendZoneOrOffsetId()
.optionalEnd()
.optionalStart()
.appendOffset("+HHMM", "0000")
.optionalEnd()
.toFormatter();
此外,创建 ZonedDateTime 的方式可能会影响是否存在异常。因此,我推荐以下内容,因为它无一例外地有效。
LocalDateTime time = LocalDateTime.parse("2013-09-20T07:00:33.123+0000", formatter);
ZonedDateTime zonedTime = time.atZone(ZoneId.systemDefault());
你试过了吗.appendPattern("ZZZ")
?它可能会起作用!