Рубрики
Без рубрики

Преобразование даты в локальную дату или локальное время и обратно

Узнайте о возможных способах преобразования между старыми java.util.Классы даты и новый API java.time.

Автор оригинала: baeldung.

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 .