Java 8 LocalDateTime ZonedDateTime无法解析带有时区的日期

amp*_*ila 7 timezone datetime jodatime java-8 java-time

我试图使用Java 8新的日期模式而不是Joda,我有以下问题:

ZonedDateTime.parse("02/05/16 11:51.12.083 +04:30", DateTimeFormatter.ofPattern("dd/MM/yy HH:mm.ss.SSS Z"))
Run Code Online (Sandbox Code Playgroud)

LocalDateTime.parse("02/05/16 11:51.12.083 +04:30", DateTimeFormatter.ofPattern("dd/MM/yy HH:mm.ss.SSS Z"))
Run Code Online (Sandbox Code Playgroud)

抛出'java.time.format.DateTimeParseException'异常.而

org.joda.time.DateTime.parse("02/05/16 11:51.12.083 +04:30", DateTimeFormat.forPattern("dd/MM/yy HH:mm.ss.SSS Z"))
Run Code Online (Sandbox Code Playgroud)

工作良好.

异常的原因是:

java.time.format.DateTimeParseException:无法在索引22处解析文本'02/05/16 11:51.12.083 +04:30'

难道我做错了什么?

ass*_*ias 8

如果您阅读了javadocDateTimeFormatter,您将找到一个详细说明如何使用Z偏移的部分(强调我的):

偏移Z:根据图案字母的数量格式化偏移.一个,两个或三个字母输出小时和分钟,没有冒号,例如'+0130'.当偏移量为零时,输出将为"+0000".四个字母输出完整形式的局部偏移,相当于Offset-O的四个字母.如果偏移为零,则输出将是相应的本地化偏移文本.五个字母输出小时,分钟,可选第二个,如果非零,则使用冒号.如果偏移量为零,则输出"Z".六个或更多字母抛出IllegalArgumentException.

所以使用5 Z秒将按预期工作:

ZonedDateTime.parse("02/05/16 11:51.12.083 +04:30",
                    DateTimeFormatter.ofPattern("dd/MM/yy HH:mm.ss.SSS ZZZZZ"));
Run Code Online (Sandbox Code Playgroud)

请注意,您可以获得类似的结果:

  • z
  • zz
  • zzz
  • zzzz
  • xxx
  • XXX
  • xxxxx
  • XXXXX