2017-06-15 51 views
6

我有一個日期存儲在數據庫中,字符串格式爲ddMMyyyy,hh:mm和TimeZone。 我想根據這些信息創建一個Instant,但我不知道該怎麼做。Java 8 - 使用TimeZone從LocalDateTime創建即時

LocalDateTime dateTime = LocalDateTime.of(2017, Month.JUNE, 1, 13, 39); 
Instant instant = dateTime.toInstant(TimeZone.getTimeZone("ECT")); 
+0

你的意思是'ZonedDateTime.ofInstant(instant,TimeZone.getDefault())'? – soorapadman

+1

@soorapadman這將返回一個ZonedDateTime。 OP想要一個即時。 –

+2

**不要在時區中使用3-4字符縮寫**這些*不是*實時區域,不是標準化的,甚至不是唯一的!使用[歐洲/倫敦](https://en.m。)格式的[大陸/地區]格式的[真實時區名稱](https://en.m.wikipedia.org/wiki/List_of_tz_database_time_zones) ,「歐洲/巴黎」(https://en.m.wikipedia.org/wiki/Europe/Paris),「亞洲/加爾各答」,「太平洋/奧克蘭」。如果通過「ECT」表示厄瓜多爾時間,則使用'ZoneId.of(「America/Guayaquil」)'。如果您的意思是中歐,請使用適當的歐洲/ ...區域名稱。 –

回答

11

您可以先創建一個ZonedDateTime與時區,然後調用toInstant

LocalDateTime dateTime = LocalDateTime.of(2017, Month.JUNE, 15, 13, 39); 
Instant instant = dateTime.atZone(ZoneId.of("Europe/Paris")).toInstant(); 
System.out.println(instant); // 2017-06-15T11:39:00Z 

我也切換到使用全時區名(每羅勒的建議),因爲它不太模糊。

+3

幾乎是一個完美的答案,但你不應該鼓勵使用3-4個字母的僞時區代碼。而是在'continent/region'格式中使用[真實時區名稱](https://en.m.wikipedia.org/wiki/List_of_tz_database_time_zones)。我猜測作者的意思是*厄瓜多爾時間*爲「ECT」。 'ZoneId.of(「America/Guayaquil」))' –

+1

@BasilBourque「ECT」實際上是歐洲中部時間(歐洲/巴黎),所以我明白爲什麼使用全名會更好;) –

+2

我只有在歐洲中部時間看到「CET」。但是,這就是關鍵,這3-4個字母代碼是一個模棱兩可的噩夢,應該像瘟疫一樣避免。 –

4

忘記舊的TimeZone類。使用ZoneId,因爲它是正確的線程安全的,您可以使用最終的靜態字段來存儲區域。

LocalDateTime dateTime = LocalDateTime.of(2017, Month.JUNE, 1, 13, 39); 
ZonedDateTime.of(dateTime, ZoneId.of("ECT")).toInstant(); 
-2

我認爲下面的代碼應該工作:

LocalDateTime time = LocalDateTime.of(2017, Month.JUNE, 15, 13, 39); 
    ZonedDateTime.of(time, TimeZone.getTimeZone("ZONE").toZoneId()).toInstant(); 

你只要有你需要的時區,以取代「ZONE」。

+4

不,TimeZone是傳統類,現在由ZoneId和ZoneOffset取代。避免傳統的日期時間類。當然,不要將遺留類與java.time類混合使用。請更正或刪除您的答案。 –