根据ZoneId调整LocalTime

Mat*_*208 4 timezone localtime timezone-offset java-8 java-time

给定一个LocalTime给定的ZoneId,如何找到调整后LocalTimeUTC

我在寻找类似的东西.atZoneLocalDateTime,但没有发现任何东西.

我怀疑我可以使用它atOffset,但我真的不明白如何使用它.

例如:

LocalTime: 15:00
ZoneId: America/Sao_Paulo (GMT -3)
Output: 18:00
Run Code Online (Sandbox Code Playgroud)

Ole*_*.V. 7

你也需要约会.例如,如果区域有夏令时(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);
Run Code Online (Sandbox Code Playgroud)

这将打印您要求的结果

18:00
Run Code Online (Sandbox Code Playgroud)

  • 是的,圣保罗有夏令时。而且我不确定是否需要调用 `toOffsetDateTime`(也许你可以只使用 `ZonedDateTime.withZoneSameInstant`,但我不在电脑前进行测试)。无论如何,给你+1! (2认同)
  • 谢谢@Hugo,稍微简化一下(我在**区找了**,在这种情况下它是带**区的**). (2认同)

Men*_*ild 5

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
Run Code Online (Sandbox Code Playgroud)