即使在阅读了大量教程之后,我也不太理解TemporalAdjusters或Java的新时间库。如何将Instant对象转换为LocalTime对象?
Instant
LocalTime
LocalTime time = LocalTime.of( instantStart.get(ChronoField.HOUR_OF_DAY), instantStart.get(ChronoField.MINUTE_OF_HOUR) );
但是没用我怎么能这么做?
ozxc1zmp1#
我的理解是... Instant是UTC样式的时间,不可知的区域总是UTC。LocalTime是一个独立于给定区域的时间。因此,假设Instant实现了TemporalAccessor,您可能会认为以下代码有效。
TemporalAccessor
Instant instant = Instant.now(); LocalTime local = LocalTime.from(instant);
但是你会得到“无法从临时访问器获得本地时间”的错误。相反,你需要说明“本地”在哪里。没有默认值-可能是件好事。
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)抛出错误,因为它在概念上不支持它,您只能通过LocalTime示例访问HOUR_OF_DAY等。
instantStart.get(ChronoField.HOUR_OF_DAY)
col17t5w2#
第一个月
tvz2xvvm3#
您可以使用系统的已配置时区,而不是硬编码时区:
instant.atZone(TimeZone.getDefault().toZoneId()).toLocalTime()
3条答案
按热度按时间ozxc1zmp1#
我的理解是... Instant是UTC样式的时间,不可知的区域总是UTC。LocalTime是一个独立于给定区域的时间。因此,假设
Instant
实现了TemporalAccessor
,您可能会认为以下代码有效。但是你会得到“无法从临时访问器获得本地时间”的错误。相反,你需要说明“本地”在哪里。没有默认值-可能是件好事。
产出
instantStart.get(ChronoField.HOUR_OF_DAY)
抛出错误,因为它在概念上不支持它,您只能通过LocalTime示例访问HOUR_OF_DAY等。col17t5w2#
第一个月
tvz2xvvm3#
您可以使用系统的已配置时区,而不是硬编码时区: