根据 ZoneId 调整 LocalTime

Adjust LocalTime according to ZoneId

给定 ZoneId 中的 LocalTime,如何在 UTC 上找到调整后的 LocalTime

我正在从 LocalDateTime 中寻找类似于 .atZone 的东西,但找不到任何东西。

我怀疑我可以将它与 atOffset 一起使用,但我真的不明白如何使用它。

例如:

LocalTime: 15:00
ZoneId: America/Sao_Paulo (GMT -3)
Output: 18:00

A ZoneId 没有意义,因为缺少日期,但您可以这样使用 ZoneOffset

LocalTime time = LocalTime.of(15, 0);
ZoneOffset offset = ZoneOffset.ofHours(-3);
LocalTime utc =
    OffsetTime.of(time, offset).withOffsetSameInstant(ZoneOffset.UTC).toLocalTime();
System.out.println(utc); // 18:00

你也需要给出一个日期。例如,如果该区域有夏令时 (DST),则需要应用正确的偏移量(我不知道圣保罗是否使用夏令时,但 Java 始终需要日期)。

这仍然比您预期的多一步,但一旦您知道如何操作,它就足够简单了。对于演示的情况,我假设你的意思是 15:00 今天,你几乎没有这样做,但我相信你会自己填写所需的日期。

    LocalTime time = LocalTime.of(15, 0);
    LocalTime utcTime = LocalDateTime.of(LocalDate.now(), time)
            .atZone(ZoneId.of("America/Sao_Paulo"))
            .withZoneSameInstant(ZoneOffset.UTC)
            .toLocalTime();
    System.out.println(utcTime);

这会打印您也要求的结果

18:00