Научитесь преобразовывать заданный 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. Мы узнали о влиянии часового пояса в обоих классах и о том, как настроить смещения пояса для конвертации между ними.