Научитесь преобразовывать 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