Java – Преобразование Instant в LocalDateTime, LocalDate или LocalTime

Научитесь преобразовывать заданный Instant в экземпляры LocalDateTime, LocalDate или LocalTime в текущем системном часовом поясе или указанном часовом поясе в Java.

1. Разница между Instant и LocalDateTime

Instant — это мгновенная точка на временной шкале без какой-либо информации о часовом поясе, связанной с ней. Внутри он использует системные часы UTC для получения момента, поэтому технически момент — это точка на временной шкале в часовом поясе UTC(нулевое смещение).

LocalDateTime — это момент в текущем часовом поясе или локальном часовом поясе. Он напоминает временную шкалу, полученную с компьютера пользователя, на котором запущена программа. LocalDateTime также не имеет никакого связанного с ним часового пояса, поэтому внутренне он настраивается на часовой пояс системы по умолчанию.

Чтобы преобразовать дату из Instant в LocalDateTime, нам необходимо скорректировать разницу смещения между UTC и местным часовым поясом.

2. Преобразование из Instant в LocalDateTime, LocalDate или LocalTime

Обычно существует два простых способа преобразования заданного Instant в экземпляр LocalDateTime:

2.1.Использование LocalDateTime.ofInstant()

мы можем использовать методы LocalDateTime.ofInstant(), LocalDate.ofInstant() или LocalTime.ofInstant(), чтобы получить локальный экземпляр даты или времени в указанном часовом поясе.

В следующем примере мы используем ZoneOffset.systemDefault(), чтобы он подстраивал момент под текущий часовой пояс машины, на которой запущена программа.

Instant instant = Instant.now(); //2023-02-02T08:22:04.824071900ZLocalDateTime ldt = LocalDateTime.ofInstant(instant, ZoneOffset.systemDefault()); //2023-02-02T13:52:04.824071900LocalDate ld = LocalDate.ofInstant(instant, ZoneOffset.systemDefault()); //2023-02-02LocalTime lt = LocalTime.ofInstant(instant, ZoneOffset.systemDefault()); //13:52:04.824071900

Если мы развернули наше приложение в облачной инфраструктуре, то трудно угадать часовой пояс, в котором будет работать приложение. В этом случае, чтобы найти LocalDateTime только в определенном часовом поясе, мы можем передать конкретную информацию о часовом поясе в метод.

Instant instant = Instant.now(); //2023-02-02T08:22:04.824071900ZLocalDateTime ldt = LocalDateTime.ofInstant(instant, ZoneOffset.of("+05:30"));LocalDate ld = LocalDate.ofInstant(instant, ZoneOffset.of("+05:30"));LocalTime lt = LocalTime.ofInstant(instant, ZoneOffset.of("+05:30"));

2.2 Использование Instant.atZone()

Основной принцип остается тем же: нам нужно настроить смещение часового пояса между UTC и часовым поясом системы по умолчанию. Метод atZone() объединяет момент с указанным часовым поясом и возвращает ZonedDateTime.

Наконец, мы используем методы ZonedDateTime toLocalDateTime(), toLocalDate() или toLocalTime(), чтобы получить соответствующий момент в локальном часовом поясе.

Instant instant = Instant.now();LocalDateTime ldt = instant.atZone(ZoneOffset.systemDefault()).toLocalDateTime();LocalDate ld = instant.atZone(ZoneOffset.systemDefault()).toLocalDate();LocalTime lt = instant.atZone(ZoneOffset.systemDefault()).toLocalTime();

Мы можем указать любой другой zoneoffset, чтобы получить локальную дату и время в любом другом часовом поясе.

3. Преобразование из LocalDateTime в Instant

В отличие от предыдущих примеров, для преобразования LocalDateTime в Instant в формате UTC мы должны удалить
Эффект смещения зоны. Для этого преобразования преобразуйте LocalDateTime в ZonedDateTime в часовом поясе по умолчанию, настройте ZoneDateTime на UTC, а затем получите Instant в UTC.

LocalDateTime ldt = LocalDateTime.now();Instant instant = ldt.atZone(ZoneId.systemDefault()).withZoneSameInstant(ZoneId.of("UTC")).toInstant();

4. Заключение

В этом коротком руководстве по Java мы научились конвертировать между экземплярами LocalDateTime и Instant с помощью Java Date Time API. Мы узнали о влиянии часового пояса в обоих классах и о том, как настроить смещения пояса для конвертации между ними.

Исходный код на Github

Прокрутить вверх