1. 개요

Java 8부터는 새로운 Date API 인 java.time이 있습니다.

그러나 때로는 여전히 새 API와 이전 API간에 변환을 수행하고 둘 다의 날짜 표현으로 작업해야합니다.

2. java.util.Datejava.time.LocalDate로 변환

이전 날짜 표시를 새 날짜로 변환하는 것으로 시작하겠습니다.

여기 에서 Java 8의 java.util.Date추가 된 새로운 toInstant () 메서드를 활용할 수 있습니다 .

Instant 객체를 변환 할 때 Instant 객체는 시간대에 구애받지  않기 때문에 ZoneId 를 사용해야 합니다. 타임 라인의 지점 일뿐입니다.

Instant 객체 atZone (ZoneId zone) API ZonedDateTime을 반환 하므로 toLocalDate () 메서드를 사용하여 LocalDate 를 추출 하면됩니다 .

먼저 기본 시스템 ZoneId를 사용합니다 .

public LocalDate convertToLocalDateViaInstant(Date dateToConvert) {
    return dateToConvert.toInstant()
      .atZone(ZoneId.systemDefault())
      .toLocalDate();
}

유사한 솔루션이지만 ofEpochMilli () 메서드를 사용하여 Instant 객체 를 만드는 다른 방법을 사용합니다 .

public LocalDate convertToLocalDateViaMilisecond(Date dateToConvert) {
    return Instant.ofEpochMilli(dateToConvert.getTime())
      .atZone(ZoneId.systemDefault())
      .toLocalDate();
}

계속 진행하기 전에 이전 java.sql.Date 클래스 와이 클래스를 LocalDate변환하는 방법도 간략히 살펴 보겠습니다 .

Java 8부터는 java.sql.Date 에서 추가 toLocalDate () 메소드를 찾을 수 있으며 ,이를 통해 java.time.LocalDate 로 쉽게 변환 할 수 있습니다 .

이 경우 시간대에 대해 걱정할 필요가 없습니다.

public LocalDate convertToLocalDateViaSqlDate(Date dateToConvert) {
    return new java.sql.Date(dateToConvert.getTime()).toLocalDate();
}

매우 유사하게 이전 Date 객체를 LocalDateTime 객체로 변환 할 수도 있습니다. 다음에 살펴 보겠습니다.

3. java.util.Datejava.time.LocalDateTime으로 변환

LocalDateTime 인스턴스 를 얻기 위해 유사하게 중개 ZonedDateTime  을 사용한 다음 toLocalDateTime () API 를 사용할 수 있습니다 .

이전과 마찬가지로 java.util.Date 에서 Instant 객체 를 얻기 위해 두 가지 가능한 솔루션을 사용할 수 있습니다 .

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.LocalDatejava.util.Date로 변환합니다.

이제 이전 데이터 표현에서 새 표현으로 변환하는 방법을 잘 이해 했으므로 다른 방향으로 변환하는 방법을 살펴 보겠습니다.

LocalDateDate 로 변환하는 두 가지 가능한 방법에 대해 설명합니다 .

첫 번째 java.sql.Date 객체에 제공된 새로운 valueOf (LocalDate date) 메서드를 사용합니다.이 메서드LocalDate 를 매개 변수로 사용합니다.

public Date convertToDateViaSqlDate(LocalDate dateToConvert) {
    return java.sql.Date.valueOf(dateToConvert);
}

보시다시피 쉽고 직관적입니다. 변환을 위해 현지 시간대를 사용합니다 (모두 내부에서 수행되므로 걱정할 필요가 없습니다).

다른 Java 8 예제에서는 java.util.Date 객체 from (Instant instant) 메소드에 전달 하는 Instant 객체를 사용 합니다.

public Date convertToDateViaInstant(LocalDate dateToConvert) {
    return java.util.Date.from(dateToConvert.atStartOfDay()
      .atZone(ZoneId.systemDefault())
      .toInstant());
}

여기 에서 Instant 객체를 사용 하고이 변환을 수행 할 때 시간대도 신경 써야합니다.

다음으로 매우 유사한 솔루션을 사용하여 LocalDateTimeDate 객체 로 변환 해 보겠습니다 .

5. java.time.LocalDateTimejava.util.Date로 변환합니다.

LocalDateTime 에서 java.util.Date 얻는 가장 쉬운 방법은 Java 8에서 사용할 수 있는 java.sql.Timestamp 의 확장을 사용하는 것입니다 .

public Date convertToDateViaSqlTimestamp(LocalDateTime dateToConvert) {
    return java.sql.Timestamp.valueOf(dateToConvert);
}

물론 대안 ZonedDateTime 에서 얻은 Instant 객체를 사용 하는 것입니다 .

Date convertToDateViaInstant(LocalDateTime dateToConvert) {
    return java.util.Date
      .from(dateToConvert.atZone(ZoneId.systemDefault())
      .toInstant());
}

6. Java 9 추가

Java 9에는 java.util.Datejava.time.LocalDate 또는 java.time.LocalDateTime 간의 변환을 단순화하는 새로운 메소드가 있습니다 .

LocalDate.ofInstant (Instant instant, ZoneId zone) LocalDateTime.ofInstant (Instant instant, ZoneId zone) 는 편리한 단축키를 제공합니다.

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.Date 를 새로운 java.time.LocalDatejava.time.LocalDateTime 으로 변환하는 방법 과 그 반대의 방법을 다뤘습니다 .

이 기사의 전체 구현은 GitHub에서 사용할 수 있습니다 .