2014-12-07 35 views
7

即使在閱讀了大量教程之後,我並沒有真正理解Temporal Adjusters或Java的新時間庫。如何將Instant轉換爲LocalTime?

如何將Instant對象轉換爲LocalTime對象。我在想以下幾點:

LocalTime time = LocalTime.of(
     instantStart.get(ChronoField.HOUR_OF_DAY), 
     instantStart.get(ChronoField.MINUTE_OF_HOUR) 
    ); 

但它不工作。我將如何做到這一點?

回答

11

我理解它的方式...即時是UTC風格的時間,不區分UTC時區。 LocaleTime是給定區域的時間。所以,你會想到以下將工作鑑於即時實現TemporalAccessor,

Instant instant = Instant.now(); 
LocalTime local = LocalTime.from(instant); 

但你得到「無法從TemporalAccessor獲得本地時間」的錯誤。相反,你需要說明「本地」在哪裏。沒有默認 - 可能是一件好事。

Instant instant = Instant.now(); 
LocalTime local = LocalTime.from(instant.atZone(ZoneId.of("GMT+3"))); 
System.out.println(String.format("%s => %s", instant, local)); 

輸出

2014-12-07T07:52:43.900Z => 10:52:43.900 

instantStart.get(ChronoField.HOUR_OF_DAY)拋出一個錯誤,因爲它不支持在概念上它,你只能通過一個本地時間實例訪問HOUR_OF_DAY等。

+0

啊。那麼我對這些課程本身有很多誤解。我試圖將事件的開始和結束時間作爲兩個實例存儲在日曆中。然後從這些實例中獲取持續時間。我該怎麼做呢?我應該如何使用Java 8 Time類來存儲這些信息。而且我也不確定我是否從Oracle教程給出的解釋中瞭解了Temporal Accessors。我可以在哪裏以更好的方式學習? – Connorelsea 2014-12-07 07:54:39

+2

@Connorelsea我不是專家,我發現新的java.time API也令人難以置信地混淆。我認爲存儲時間會更好,並且只有在您真正需要向用戶顯示時(在給定的時區內)才使用LocalTime。 – Adam 2014-12-07 08:19:04

+0

實際上,LocalTime不包含時區。它的javadoc聲明:「這個類不存儲或表示日期或時區,而是描述當地時間,如掛鐘。」 Afaik,即時通訊沒有象一天中的小時那樣的概念,但距離這個時代只有幾秒鐘的時間。這就是您首先必須從該時刻創建ZonedDateTime的原因。 – Alex 2017-03-02 13:40:02

相關問題