1. 개요
Java 8부터는 새로운 Date API 인 java.time이 있습니다.
그러나 때로는 여전히 새 API와 이전 API간에 변환을 수행하고 둘 다의 날짜 표현으로 작업해야합니다.
2. java.util.Date 를 java.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.Date 를 java.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.LocalDate 를 java.util.Date로 변환합니다.
이제 이전 데이터 표현에서 새 표현으로 변환하는 방법을 잘 이해 했으므로 다른 방향으로 변환하는 방법을 살펴 보겠습니다.
LocalDate 를 Date 로 변환하는 두 가지 가능한 방법에 대해 설명합니다 .
첫 번째 는 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 객체를 사용 하고이 변환을 수행 할 때 시간대도 신경 써야합니다.
다음으로 매우 유사한 솔루션을 사용하여 LocalDateTime 을 Date 객체 로 변환 해 보겠습니다 .
5. java.time.LocalDateTime 을 java.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.Date 와 java.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.LocalDate 및 java.time.LocalDateTime 으로 변환하는 방법 과 그 반대의 방법을 다뤘습니다 .