根据ZoneId调整LocalTime

时间:2017-06-07 14:52:43

标签: java-8 timezone java-time timezone-offset localtime

如果给定LocalTime中的ZoneId,我怎样才能在LocalTime找到经过调整的UTC

我正在寻找与.atZone LocalDateTime类似的内容,但无法找到任何内容。

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

例如:

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

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:5)

你也需要约会。例如,如果区域有夏令时(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