Метод withZoneSameInstant
Метод withZoneSameInstant класса ZonedDateTime возвращает копию текущего объекта даты-времени с той же временной точкой (instant), но в другой временной зоне. Это означает, что момент времени сохраняется, а локальное представление даты и времени пересчитывается под новую зону. В параметр мы передаем объект ZoneId - временную зону, в которую нужно перевести дату-время.
Синтаксис
zdt.withZoneSameInstant(zone)
Пример
Давайте создадим дату-время в зоне Europe/Paris и переведем ее в зону Asia/Tokyo, сохраняя тот же момент времени:
import java.time.ZonedDateTime;
import java.time.ZoneId;
public class Main
{
public static void main(String[] args)
{
ZonedDateTime zdt = ZonedDateTime.of(
2025, 12, 25, 12, 0, 0, 0,
ZoneId.of("Europe/Paris")
);
ZonedDateTime res = zdt.withZoneSameInstant(
ZoneId.of("Asia/Tokyo")
);
System.out.println(zdt);
System.out.println(res);
}
}
Результат выполнения кода:
2025-12-25T12:00+01:00[Europe/Paris]
2025-12-25T20:00+09:00[Asia/Tokyo]
Пример
Давайте убедимся, что момент времени не меняется, сравнив объекты Instant до и после преобразования:
import java.time.ZonedDateTime;
import java.time.ZoneId;
import java.time.Instant;
public class Main
{
public static void main(String[] args)
{
ZonedDateTime zdt = ZonedDateTime.of(
2025, 1, 1, 0, 0, 0, 0,
ZoneId.of("UTC")
);
ZonedDateTime res = zdt.withZoneSameInstant(
ZoneId.of("America/New_York")
);
Instant instant1 = zdt.toInstant();
Instant instant2 = res.toInstant();
System.out.println(instant1);
System.out.println(instant2);
System.out.println(instant1.equals(instant2));
}
}
Результат выполнения кода:
2025-01-01T00:00:00Z
2025-01-01T00:00:00Z
true
Пример
Давайте переведем дату-время в системную временную зону по умолчанию:
import java.time.ZonedDateTime;
import java.time.ZoneId;
public class Main
{
public static void main(String[] args)
{
ZonedDateTime zdt = ZonedDateTime.of(
2025, 6, 15, 10, 30, 0, 0,
ZoneId.of("UTC")
);
ZonedDateTime res = zdt.withZoneSameInstant(
ZoneId.systemDefault()
);
System.out.println(zdt);
System.out.println(res);
}
}
Результат выполнения кода (зависит от системной зоны):
2025-06-15T10:30Z[UTC]
2025-06-15T13:30+03:00[Europe/Moscow]
Смотрите также
-
класс
ZonedDateTime,
который представляет дату-время с временной зоной -
метод
toInstant,
который возвращает момент времени объекта -
класс
ZoneId,
который представляет временную зону -
метод
toLocalDateTime,
который возвращает локальную дату-время