Конвертация между LocalDate и ZonedDateTime

Научитесь преобразовывать LocalDate в ZonedDateTime и из ZonedDateTime в LocalDate в Java 8.

Как мы знаем, LocalDate представляет собой календарную дату без информации о времени и поясе. Экземпляр ZonedDateTime содержит все три информации, т.е. дату, время и пояс.

ZonedDateTime = LocalDate + время + часовой пояс

1. LocalDate в ZonedDateTime

Чтобы преобразовать экземпляр LocalDate в экземпляр ZonedDateTime, у нас есть два подхода.

1.1. Локальная дата -> Зональная дата и время

Если мы хотим только преобразовать локальную дату в текущем часовом поясе в локальную дату в другом часовом поясе, т.е. хотим только добавить информацию о поясе, то мы можем использовать метод LocalDate.atStartOfDay(zoneId).

 LocalDate localDate = LocalDate.now();ZonedDateTime zonedDateTime = localDate.atStartOfDay(ZoneId.of("EST5EDT"));System.out.println(зонированнаяДатаВремя);

Вывод программы.

 2019-04-02T00:00-04:00[EST5EDT]

1.2. Локальная дата -> Локальная дата и время -> Зональная дата и время

Если мы хотим добавить как информацию о времени, так и о часовом поясе к localdate, то нам нужно добавить обе части одну за другой, чтобы получить экземпляр ZonedDateTime. Мы можем использовать следующие методы для добавления информации о времени к local date.

  • Зонированная дата и время вНачало дня()
  • ZonedDateTime atTime( местное время)
  • ZonedDateTime atTime(целое число часов, целое число минут)
  • ZonedDateTime atTime(целое число часов, целое число минут, целое число секунд)
  • ZonedDateTime atTime(целый час, целая минута, целая секунда, целая наносекунда)

Затем мы можем использовать метод LocalDateTime.atZone(ZoneId) для добавления информации о зоне.

LocalDate localDate = LocalDate.now(); //local dateLocalDateTime localDateTime = localDate.atTime(10, 45, 56); //Add time informationZoneId zoneId = ZoneId.of("Asia/Kolkata"); // Zone informationZonedDateTime zdtAtAsia = localDateTime.atZone(zoneId); // add zone informationZonedDateTime zdtAtET = zdtAtAsia.withZoneSameInstant(ZoneId.of("America/New_York")); // Same time in ET timezoneSystem.out.println(zdtAtAsia);System.out.println(zdtAtET);

Вывод программы.

 2019-04-02T10:45:56+05:30[Азия/Калькутта]2019-04-02T01:15:56-04:00[Америка/Нью_Йорк]

2. Зональная дата и время в локальную дату

Чтобы преобразовать ZonedDateTime в экземпляр LocalDate, используйте метод toLocalDate(). Он возвращает LocalDate с тем же годом, месяцем и днем, что и заданная дата-время.

ZonedDateTime zonedDateTime = ZonedDateTime.now();LocalDate localDate = zonedDateTime.toLocalDate();System.out.println(localDate);

Вывод программы.

 2019-04-02 

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

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