Есть ли способ преобразовать 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