2016-05-16 103 views
5

我试图用Java 8新的日期格式而非乔达和我有以下问题:的Java 8 LocalDateTime ZonedDateTime不能与时区的解析日期

两个

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

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

抛出'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")) 

工作正常。

原因的异常是:

java.time.format.DateTimeParseException:文本'02/5月16日11:51.12.083 04:30' 无法在索引被解析22

我做错了什么?

+2

你试过OffsetDateTime?它没有足够的信息来知道实际的时区;它所承载的全部是与UTC的偏移量。 –

+0

虽然从[docs](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html)中的示例中,似乎冒号被接受为区域偏移量分隔符,但是当你尝试它时,它会抛出异常。如果你只是删除冒号它应该工作。所以你的日期时间字符串应该是'02/05/16 11:51.12.083 + 0430' –

+0

@Hank DI试过这个OffsetDateTime.parse(“02/05/16 11:51.12.083 +04:30”,DateTimeFormatter.ofPattern (“dd/MM/YY HH:mm.ss.SSS Z”)),但我仍然得到相同的异常。 – ampofila

回答

5

如果你读the javadoc of DateTimeFormatter,你会发现一节详述了如何使用Z偏移(重点是我的):

偏移量Z:这将根据模式字母的数量设置偏移量。一个,两个或三个字母输出小时和分钟,没有冒号,例如'+0130'。当偏移量为零时,输出将为'+0000'。四个字母输出完整形式的本地化偏移量,相当于Offset-O的四个字母。如果偏移量为零,则输出将是相应的本地化偏移文本。 五个字母输出小时,分钟,可选秒如果非零,则用冒号输出。如果偏移量为零,则输出“Z”。六个或更多字母会抛出IllegalArgumentException。

因此,使用5个Z S作为预期将工作:

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

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

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

您需要使用XXX作为区域偏移量。这将工作为ZonedDateTimeOffsetDateTime

ZonedDateTime.parse("02/05/16 11:51.12.083 +04:30", DateTimeFormatter.ofPattern("dd/MM/yy HH:mm.ss.SSS XXX")) 

它将与LocalDateTime解析为好,但区偏移将被截断。

+0

我已经试过这个,仍然是同样的例外。 (ZonedDateTime.parse(“02/05/16 11:51.12.083 +04:30”,DateTimeFormatter.ofPattern(“dd/MM/YY HH:mm.ss.SSS X”))) – ampofila

1

我找到了答案在这个岗位Unparsable Date with colon-separated timezone

为了解析携带用分号来代替X或Z时区为DateFormatter的javadoc表明,你需要使用XXX时间戳。以下所有工作:

LocalDateTime.parse("02/05/16 11:51.12.083 +04:30", DateTimeFormatter.ofPattern("dd/MM/yy HH:mm.ss.SSS XXX")) 

OffsetDateTime.parse("02/05/16 11:51.12.083 +04:30", DateTimeFormatter.ofPattern("dd/MM/yy HH:mm.ss.SSS XXX")) 

ZonedDateTime.parse("02/05/16 11:51.12.083 +04:30", DateTimeFormatter.ofPattern("dd/MM/yy HH:mm.ss.SSS XXX")) 
0

使用DateTimeFormatterBuilder获得解析器的精确控制和使用appendOffsetId作品:

DateTimeFormatter formatter = new DateTimeFormatterBuilder() 
     .appendValue(ChronoField.DAY_OF_MONTH, 2) 
     .appendLiteral('/') 
     .appendValue(ChronoField.MONTH_OF_YEAR, 2) 
     .appendLiteral('/') 
     .appendValueReduced(ChronoField.YEAR, 2, 2, 2000) 
     .appendLiteral(' ') 
     .appendValue(ChronoField.HOUR_OF_DAY) 
     .appendLiteral(':') 
     .appendValue(ChronoField.MINUTE_OF_HOUR) 
     .appendLiteral('.') 
     .appendValue(ChronoField.SECOND_OF_MINUTE) 
     .appendLiteral('.') 
     .appendValue(ChronoField.MILLI_OF_SECOND) 
     .appendLiteral(' ') 
     .appendOffsetId() 
     .toFormatter(); 

OffsetDateTime.parse("02/05/16 11:51.12.083 +04:30", formatter);