2014-05-11 92 views
18

我最近轉移到Java 8,希望能更輕鬆地處理本地和分區時間。無法使用Java 8中的DateTimeFormatter和ZonedDateTime從TemporalAccessor獲取ZonedDateTime

但是,在我看來,在解析簡單日期時,我面臨着一個簡單的問題。

public static ZonedDateTime convertirAFecha(String fecha) throws Exception { 
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
      ConstantesFechas.FORMATO_DIA).withZone(
      obtenerZonaHorariaServidor()); 

    ZonedDateTime resultado = ZonedDateTime.parse(fecha, formatter); 
    return resultado; 
} 

在我的情況:

  • 日期星是'15/06/2014'
  • ConstantesFechas.FORMATO_DIA是 '日/月/年'
  • obtenerZonaHorariaServidor返回ZoneId.systemDefault()

所以,這是一個簡單的例子。但是,解析拋出此異常:

java.time.format.DateTimeParseException: Text '15/06/2014' could not be parsed: Unable to obtain ZonedDateTime from TemporalAccessor: {},ISO resolved to 2014-06-15 of type java.time.format.Parsed 

任何提示?我一直在嘗試解析和使用TemporalAccesor的不同組合,但目前爲止沒有任何運氣。

問候

回答

19

我不知道爲什麼它不工作(可能是因爲你的投入沒有時間/時區信息)。一個簡單的方法是解析您的日期作爲LocalDate第一(沒有時間或時區信息),然後創建一個ZonedDateTime

public static ZonedDateTime convertirAFecha(String fecha) { 
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy"); 
    LocalDate date = LocalDate.parse(fecha, formatter); 

    ZonedDateTime resultado = date.atStartOfDay(ZoneId.systemDefault()); 
    return resultado; 
} 
9

這是一個錯誤,請參閱JDK-bug-log。根據這些信息,Java 9和Java 8u20解決了這個問題。嘗試下載最新的Java 8版本。今天在2014-05-12:有一個early access release 8u20可用。

UPDATE:

我個人認爲,因爲你只有和期望「DD/MM/YYYY」爲圖案,@assylias已經提出,你應該使用LocalDate作爲主要類型。關於你的情況,幾乎可以肯定的是設計失敗,使用ZonedDateTime。你想用這種類型的對象做什麼?我只能將專門的時區計算看作是用例。而且你甚至不能直接將這些ZonedDateTime對象存儲在數據庫中,所以這種類型遠沒有許多人認爲的那麼有用。

我所描述的用例問題實際上是Java-8引入的一個新方面,與舊的GregorianCalendar-類(這是一種全功能於一身的類型)相比。用戶必須開始考慮爲他們的問題和用例選擇適當的時間類型。

+1

尼斯趕上 - 雖然我相信運仍然需要提供一次能夠將輸入解析爲ZonedDateTime。 – assylias

+1

@assylias是的,OP應該至少延長模式的時間部分或選擇你的建議。這也可能依賴於寬鬆的解析配置等。實際上,我無法在當前位置用Java-8測試這些細節。 –

+3

更好的錯誤報告鏈接是https://bugs.openjdk.java.net/browse/JDK-8033662 – JodaStephen

2

簡單地說,該行

ZonedDateTime.parse('2014-04-23', DateTimeFormatter.ISO_OFFSET_DATE_TIME) 

拋出異常:

Text '2014-04-23' could not be parsed at index 10 
java.time.format.DateTimeParseException: Text '2014-04-23' could not be parsed at index 10 

它看起來就像是我的錯誤。

我用這個解決方法:

String dateAsStr = '2014-04-23'; 
if (dateAsStr.length() == 10) { 
    dateAsStr += 'T00:00:00'; 
} 
ZonedDateTime.parse(dateAsStr, DateTimeFormatter.ISO_OFFSET_DATE_TIME.withZone(ZoneId.systemDefault())); 
+0

這是一個dateTIME,所以沒有時間部分的字符串不是有效的日期時間... – Koshinae

0

只是一個例子轉換,我相信有些人會得到下面

(java.time.DateTimeException: Unable to obtain LocalDateTime from TemporalAccessor: 2014-10-24T18:22:09.800Z of type java.time.Instant) 

的異常,如果他們試圖

LocalDateTime localDateTime = LocalDateTime.from(new Date().toInstant()); 

來解決問題,請通過區域 -

LocalDateTime localDateTime = LocalDateTime.from(new Date() 
     .toInstant().atZone(ZoneId.of("UTC"))); 
0

如果從谷歌來:

而不是做:

ZonedDateTime.from(new Date().toInstant()); 

試試這個:

ZonedDateTime.ofInstant(new Date(), ZoneId.of("UTC")); 
相關問題