1. Обзор
Начиная с Java 8, у нас есть новый API даты: java.time .
Однако иногда нам все еще нужно выполнять преобразования между новым и старым API и работать с представлениями данных из обоих.
Дальнейшее чтение:
Переход на новый API даты и времени Java 8
Введение в API даты и времени Java 8
2. Преобразование java.util.Дата на java.время.LocalDate
Давайте начнем с преобразования старого представления данных в новое.
Здесь мы можем воспользоваться новым методом |/to Instant () , который был добавлен в java.util.Дата в Java 8.
Когда мы преобразуем объект Instant |/, необходимо использовать ZoneId , потому что Instant объекты не зависят от часового пояса — просто точки на временной шкале.
atZone(ZoneId zone) API из Instant объекта возвращает ZonedDateTime , поэтому нам просто нужно извлечь Локальные данные из него с помощью метода toLocalDate () .
Во-первых, мы используем систему по умолчанию ZoneId :
public LocalDate convertToLocalDateViaInstant(Date dateToConvert) { return dateToConvert.toInstant() .atZone(ZoneId.systemDefault()) .toLocalDate(); }
И аналогичное решение, но с другим способом создания Instant объекта — с использованием метода ofEpochMilli() :
public LocalDate convertToLocalDateViaMilisecond(Date dateToConvert) { return Instant.ofEpochMilli(dateToConvert.getTime()) .atZone(ZoneId.systemDefault()) .toLocalDate(); }
Прежде чем мы продолжим, давайте также быстро рассмотрим класс old java.sql.Date и то, как его можно преобразовать в Локальные данные .
Начиная с Java 8, мы можем найти дополнительный метод toLocalDate() в java.sql.Date , который также дает нам простой способ преобразования его в java.time.LocalDate .
В этом случае нам не нужно беспокоиться о часовом поясе:
public LocalDate convertToLocalDateViaSqlDate(Date dateToConvert) { return new java.sql.Date(dateToConvert.getTime()).toLocalDate(); }
Точно так же мы можем преобразовать старый объект Date в объект LocalDateTime . Давайте посмотрим на это дальше.
3. Преобразование java.util.Дата на java.время.LocalDateTime
Чтобы получить экземпляр LocalDateTime , мы можем аналогичным образом использовать посредника ZonedDateTime , а затем использовать toLocalDateTime() API.
Как и раньше, мы можем использовать два возможных решения для получения Instant объекта из java.util.Дата :
public LocalDateTime convertToLocalDateTimeViaInstant(Date dateToConvert) { return dateToConvert.toInstant() .atZone(ZoneId.systemDefault()) .toLocalDateTime(); } public LocalDateTime convertToLocalDateTimeViaMilisecond(Date dateToConvert) { return Instant.ofEpochMilli(dateToConvert.getTime()) .atZone(ZoneId.systemDefault()) .toLocalDateTime(); }
И, начиная с Java 8, мы также можем использовать java.sql.Timestamp для получения LocalDateTime :
ocalDateTime convertToLocalDateTimeViaSqlTimestamp(Date dateToConvert) { return new java.sql.Timestamp( dateToConvert.getTime()).toLocalDateTime(); }
4. Преобразуйте java.time.LocalDate в java.util.Date
Теперь, когда у нас есть хорошее понимание того, как преобразовать старое представление данных в новое, давайте посмотрим на преобразование в другом направлении.
Мы обсудим два возможных способа преобразования Локальной даты в Дату .
В первом случае мы используем новый метод valueOf(LocalDate date) , предоставленный в | java.sql.Date object, который принимает Локальные данные в качестве параметра:
public Date convertToDateViaSqlDate(LocalDate dateToConvert) { return java.sql.Date.valueOf(dateToConvert); }
Как мы видим, это легко и интуитивно. Он использует местный часовой пояс для преобразования (все делается под капотом, так что не нужно беспокоиться).
В другом примере Java 8 мы используем объект Instant , который мы передаем в from(Instant instant) | метод | java.util.Дата объект:
public Date convertToDateViaInstant(LocalDate dateToConvert) { return java.util.Date.from(dateToConvert.atStartOfDay() .atZone(ZoneId.systemDefault()) .toInstant()); }
Обратите внимание, что мы используем здесь объект Instant и что нам также нужно заботиться о часовых поясах при выполнении этого преобразования.
Далее, давайте используем очень похожее решение для преобразования LocalDateTime в Date объект.
5. Конвертируйте java.time.LocalDateTime в java.util.Date
Самый простой способ получить a java.util.Дата из LocalDateTime должна использовать расширение для |/java.sql.Timestamp — доступно с Java 8:
public Date convertToDateViaSqlTimestamp(LocalDateTime dateToConvert) { return java.sql.Timestamp.valueOf(dateToConvert); }
Но, конечно, альтернативным решением является использование объекта an Instant , который мы получаем из ZonedDateTime :
Date convertToDateViaInstant(LocalDateTime dateToConvert) { return java.util.Date .from(dateToConvert.atZone(ZoneId.systemDefault()) .toInstant()); }
6. Дополнения Java 9
В Java 9 доступны новые методы, упрощающие преобразование между java.util.Дата и java.time.LocalDate или java.time.LocalDateTime .
LocalDate.of Instant(Мгновенный момент, зона ZoneId) и LocalDateTime.ofInstant(Мгновенный момент, зона ZoneId) предоставляют удобные ярлыки:
public LocalDate convertToLocalDate(Date dateToConvert) { return LocalDate.ofInstant( dateToConvert.toInstant(), ZoneId.systemDefault()); } public LocalDateTime convertToLocalDateTime(Date dateToConvert) { return LocalDateTime.ofInstant( dateToConvert.toInstant(), ZoneId.systemDefault()); }
7. Заключение
В этой статье мы рассмотрели возможные способы преобразования старого java.util.Дата в новый java.time.LocalDate и java.time.LocalDateTime , а также наоборот.
Полная реализация этой статьи доступна на GitHub .