2016-05-16 107 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);