2017-06-15 58 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类混合使用。请更正或删除您的答案。 –

相关问题