如何将Instant转换为LocalTime?

Con*_*sea 14 java datetime java-8

即使在阅读了大量教程之后,我也不是真正了解Temporal Adjusters或Java的新时间库.

如何将Instant对象转换为LocalTime对象.我正在思考以下几点:

LocalTime time = LocalTime.of(
        instantStart.get(ChronoField.HOUR_OF_DAY),
        instantStart.get(ChronoField.MINUTE_OF_HOUR)
    );
Run Code Online (Sandbox Code Playgroud)

但它没有用.我该怎么做?

Ada*_*dam 19

我理解它的方式......即时是一种UTC风格的时间,不知道区域总是UTC.LocaleTime是给定区域的时间.因此,如果Instant实现TemporalAccessor,您会期望以下内容可行,

Instant instant = Instant.now();
LocalTime local =  LocalTime.from(instant);
Run Code Online (Sandbox Code Playgroud)

但是你得到"无法从TemporalAccessor获取LocalTime"错误.相反,你需要说明"本地"的位置.没有默认 - 可能是一件好事.

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

产量

2014-12-07T07:52:43.900Z => 10:52:43.900
Run Code Online (Sandbox Code Playgroud)

instantStart.get(ChronoField.HOUR_OF_DAY)抛出一个错误,因为它在概念上不支持它,你只能通过LocalTime实例访问HOUR_OF_DAY等.

  • @Connorelsea我不是专家,我发现新的java.time API也令人难以置信.我认为存储时刻会更好,只有当你真正需要向用户显示时(在给定的时区内)才使用LocalTime. (3认同)
  • 这些课程几乎是完全不同的事情。“即时”是时间中的一个时刻。快照,例如第二次世界大战结束的那一刻。它并不是真正具体谈论时间或日期,它只是某个时刻的快照。`LocalTime` 是关于时间的概念。例如,如果我说_“我喜欢早上 8 点起床”_,这与一天中的实际时间或其他任何事情无关。与“LocalDate”类似,我说圣诞节是 12 月 25 日。这只是关于日期的概念,而不是关于真正的日期。 (2认同)