JDK8调整一次java.time.Instant

JDK8 adjust time of a java.time.Instant

我正在尝试调整 java.time.Instant 的时间。

我试过这段代码:

Instant validFrom = //from my method parameter
validFrom = validFrom.with(ChronoField.HOUR_OF_DAY, 19).with(ChronoField.MINUTE_OF_DAY, 00)
                    .with(ChronoField.SECOND_OF_DAY, 00).with(ChronoField.MILLI_OF_DAY, 00);

但我有一个例外:

java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: HourOfDay
    at java.time.Instant.with(Instant.java:720)

阅读文档和检查源代码,这是非常符合预期的。 我不太清楚为什么我不能那样做。是否有另一种方法可以在不引起多次转换的情况下执行此操作?

这是因为Instant没有时区信息。 19:00 小时不代表任何有用的东西,除非你给它附加时区。

您可以将其转换为 ZonedDateTime 对象,然后像这样将其转换回 Instant

public void testInstant(){
    Instant now = Instant.now();
    ZonedDateTime utc = now.atZone(ZoneId.of("UTC"));

    ZonedDateTime zonedDateTime = utc.withHour(19)
            .withMinute(0)
            .withSecond(0);

    Instant instant = zonedDateTime.toInstant();
}