Есть ли способ преобразовать ZoneOffset в ZoneId в Java 8?

Я работаю над проектом, в котором у меня ограниченный идентификатор зоны, и я получаю набор ZoneOff из внешнего интерфейса, поэтому я хочу преобразовать набор времени отключения в ZoneID в Java. Есть ли способ преобразовать ZoneOffset в идентификатор зоны.

3 ответа

это своего рода ! См. декларацию в документации.

      public final class ZoneOffset
extends ZoneId

Никаких дополнительных действий не требуется. Вы можете напрямую передавать объекты вещам, которые ожидаютZoneIdс.


Если вы действительно хотите найти идентификатор зоны на основе региона , напримерEurope/London, исключительно изZoneOffset, скорее всего, будет несколько таких идентификаторов, имеющих смещение прямо сейчас или в любой другой конкретный момент.

Чтобы найти список идентификаторов на основе региона, который находится с указанным смещением в определенный момент, вы можете сделать:

      ZoneId.getAvailableZoneIds().stream()
    .map(ZoneId::of)
    .filter(id -> id.getRules().getOffset(theSpecifiedInstant).equals(theSpecifiedOffset))
    .collect(Collectors.toList());
    // or just .toList() in Java 16+

Используйте доступныеZoneRulesчтобы найти подходящую зону соответствия. Нет прямого преобразованияZoneOffsetпредставляетfixed offsetот UTC, тогда какZoneIdпредставляет собой географический регион с различными смещениями из-за изменений летнего времени . Основываясь на вышеизложенном, вы можете создать его самостоятельно, чтобы выполнить такое преобразование. Вот шаблон

Java 11+: ZoneRules.getStandardOffset(мгновенно)

Получает стандартное смещение для указанного момента в этой зоне.

Это обеспечивает доступ к исторической информации о том, как стандартное смещение менялось с течением времени. Стандартное смещение — это смещение до применения летнего времени. Обычно это компенсация, применимая зимой.

Это означает, что если у вас есть , вы можете получить его правила, вызвавgetRules()и получить стандартное смещениеInstantвы предоставляетеgetStandardOffset(Instant). Вы могли бы использоватьInstant.now()как только у вас появитсяZoneIdс переднего конца.

пример

      public static void main(String[] args) {
    // example input
    ZoneId perth = ZoneId.of("Australia/Perth");
    // define an Instant
    Instant now = Instant.now();
    // determine the standard offset from the rules of the zone
    ZoneOffset perthStandardOffset = perth.getRules()
                                          .getStandardOffset(now);
    // and print it
    System.out.println(
            String.format("%s has a standard offset of %s at %s",
                          perth, perthStandardOffset,
                          now.atZone(ZoneOffset.UTC))
            );
}

выход

      Australia/Perth has a standard offset of +08:00 at 2023-06-07T07:41:38.082053Z
Другие вопросы по тегам