어제 오늘 내일

[Java] Date <-> LocalDate, LocalDateTime 변환하기 본문

IT/Java

[Java] Date <-> LocalDate, LocalDateTime 변환하기

hi.anna 2021. 6. 20. 22:41

 

  1. Date -> LocalDate, LocalDateTime
    1. Date -> Instant -> ZonedDateTime -> LocalDate, LocalDateTime
    2. Date -> java.sql.Date, java.sql.Timestamp -> LocalDate, LocalDateTime
    3. LocalDate.ofInstant(), LocalDateTime.ofInstant() : Java 9 이상
  2. LocalDateTime -> Date
    1. java.sql.Timestamp.valueOf()
    2. java.util.Date.from()
  3. LocalDate -> Date
    1. java.sql.Date.valueOf()
    2. java.util.Date.from()

 

 

1. Date -> LocalDate, LocalDateTime

1. 1 Date -> Instant -> ZonedDateTime -> LocalDate, LocalDateTime

Date를 LocalDate 또는 LocalDateTime 객체로 변환하기 위해서 다음의 3단계를 거칩니다.

  1. Date -> Instant
  2. Instant -> ZonedDateTime
  3. ZonedDateTime -> LocalDate, LocalDateTime

  예제  

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;

public class DateToLocalDateTime {
    public static void main(String[] args) {
        
        // 1. Date 객체 생성 (현재날짜)
        Date date = new Date();

        // 2. Date -> LocalDate
        LocalDate localDate = date.toInstant()   // Date -> Instant
                .atZone(ZoneId.systemDefault())  // Instant -> ZonedDateTime
                .toLocalDate(); // ZonedDateTime -> LocalDate

        // 3. Date -> LocalDateTime
        LocalDateTime localDateTime = date.toInstant() // Date -> Instant
                .atZone(ZoneId.systemDefault()) // Instant -> ZonedDateTime
                .toLocalDateTime(); // ZonedDateTime -> LocalDateTime

        // 4. Date, LocalDate, LocalDateTime 출력
        System.out.println(date);  // Sun Jun 20 21:09:20 KST 2021
        System.out.println(localDate);  // 2021-06-20
        System.out.println(localDateTime);  // 2021-06-20T21:09:20.461
    }
}

 

 

1. 2 Date -> java.sql.Date, java.sql.Timestamp -> LocalDate, LocalDateTime

Date 객체를 java.sql.Date 또는 java.sql.Timestamp 객체로 변환한뒤

toLocalDate(), toLocalDateTime()를 이용할 수도 있습니다.

 

  Date를 LocalDate로 변환하기  

  1. java.util.Date -> java.sql.Date
  2. java.sql.Date -> LocalDate

  Date를 LocalDateTime으로 변환하기  

  1. java.util.Date -> java.sql.Timestamp
  2. java.sql.Timestamp -> LocalDateTime

 

  예제  

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date;

public class DateToLocalDateTime {
    public static void main(String[] args) {
        
        // 1. Date 객체 생성 (현재날짜)
        Date date = new Date();

        // 2. Date -> LocalDate
        LocalDate localDate = new java.sql.Date(date.getTime())  // java.util.Date -> java.sql.Date
                .toLocalDate();  // java.sql.Date -> LocalDate

        // 3. Date -> LocalDateTime
        LocalDateTime localDateTime = new java.sql.Timestamp(date.getTime())  // java.util.Date -> java.sql.Timestamp
                .toLocalDateTime();  // java.sql.Timestamp -> LocalDateTime

        // 4. Date, LocalDate, LocalDateTime 출력
        System.out.println(date);  // Sun Jun 20 21:09:20 KST 2021
        System.out.println(localDate);  // 2021-06-20
        System.out.println(localDateTime);  // 2021-06-20T21:09:20.461
    }
}

 

 

1. 3 LocalDate.ofInstant(), LocalDateTime.ofInstant() : Java 9 이상

Java 9 버전 이상에서는

LocalDate.ofInstant(), LocalDateTime.ofInstant() 메소드를 이용하여

좀 더 쉽게 Date로 변환할 수 있습니다.

 

public static LocalDate ofInstant​(Instant instant, ZoneId zone)

LocalDate 클래스의 ofInstant() 메소드는

Instant와 ZoneId를 파라미터로 받아서 LocalDate로 변환합니다.

 

public static LocalDateTime ofInstant​(Instant instant, ZoneId zone)

LocalDateTime 클래스의 ofInstant() 메소드는

Instant와 ZoneId를 파라미터로 받아서 LocalDateTime으로 변환합니다.

 

  예제  

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;

public class DateToLocalDateTime {
    public static void main(String[] args) {
        
        // 1. Date 객체 생성 (현재날짜)
        Date date = new Date();

        // 2. Date -> LocalDate
        LocalDate localDate = LocalDate.ofInstant(date.toInstant(), ZoneId.systemDefault());

        // 3. Date -> LocalDateTime
        LocalDateTime localDateTime = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());

        // 4. Date, LocalDate, LocalDateTime 출력
        System.out.println(date);  // Sun Jun 20 21:09:20 KST 2021
        System.out.println(localDate);  // 2021-06-20
        System.out.println(localDateTime);  // 2021-06-20T21:09:20.461
    }
}

 

 

 

2. LocalDateTime -> Date

2. 1 java.sql.Timestamp.valueOf()

public static Timestamp valueOf(LocalDateTime dateTime)

java.sql.Timestamp 클래스의 valueOf() 메소드는

LocalDateTime 객체를 파라미터로 받아서

Timestamp 객체로 변환하여 리턴합니다.

 

  예제  

import java.time.LocalDateTime;
import java.util.Date;

public class LocalDateTimeToDate {
    public static void main(String[] args) {
        
        // 1. LocalDateTime 객체 생성(현재 시간)
        LocalDateTime localDateTime = LocalDateTime.now();

        // 2. LocalDateTime -> Date 변환
        Date date = java.sql.Timestamp.valueOf(localDateTime);

        // 3. LocalDateTime, Date 결과 출력
        System.out.println(localDateTime);  // 2021-06-20T21:45:14.172849300
        System.out.println(date);  // 2021-06-20 21:45:14.1728493
    }
}

Date date = java.sql.Timestamp.valueOf(localDateTime);

java.sql.Timestamp 클래스는 java.util.Date 클래스의 자식 클래스이므로,

Timestamp 객체를 Date 객체로 형변환 할 수 있습니다.

 

 

2. 2 java.util.Date.from()

public static Date from(Instant instant)

java.util.Date 클래스의 static 메소드인 from() 메소드는

Instant를 파라미터로 받아서, Date 객체로 변환하여 리턴합니다.

 

  예제  

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;

public class LocalDateTimeToDate {
    public static void main(String[] args) {
        
        // 1. LocalDateTime 객체 생성(현재 시간)
        LocalDateTime localDateTime = LocalDateTime.now();

        // 2. LocalDateTime -> Date 변환
        Instant instant = localDateTime.atZone(ZoneId.systemDefault()).toInstant();
        Date date = Date.from(instant);

        // 3. LocalDateTime, Date 결과 출력
        System.out.println(localDateTime);  // 2021-06-20T21:45:14.172849300
        System.out.println(date);  // 2021-06-20 21:45:14.1728493
    }
}

Instant instant = localDateTime.atZone(ZoneId.systemDefault()).toInstant();

Date.from()의 파라미터로 Instant를 전달해주기 위해서,

LocalDateTime 객체를 Instant로 변환해 주었습니다.

LocalDateTime  -> ZonedDateTime -> Instant

위 순서로 LocalDateTime을 Instant로 변환하였습니다.

 

 

 

3. LocalDate -> Date

3. 1 java.sql.Date.valueOf()

public static Date valueOf(LocalDate date)

java.sql.Date 클래스의 valueOf() 메소드는

LocalDate 객체를 파라미터로 받아서

java.sql.Date 객체로 변환하여 리턴합니다.

 

  예제  

import java.time.LocalDate;
import java.util.Date;

public class LocalDateToDate {
    public static void main(String[] args) {

        // 1. LocalDate 객체 생성(현재 시간)
        LocalDate localDate = LocalDate.now();

        // 2. LocalDate -> Date 변환
        Date date = java.sql.Date.valueOf(localDate);

        // 3. LocalDate, Date 결과 출력
        System.out.println(localDate); // 2021-06-20
        System.out.println(date); // 2021-06-20
    }
}

Date date = java.sql.Date.valueOf(localDate);

java.sql.Date 클래스는 java.util.Date 클래스의 자식 클래스이므로,

java.sql.Date.valueOf() 메소드가 리턴하는 값이 java.sql.Date 클래스이지만,

자동으로 타입 캐스팅 되었습니다.

 


3. 2 java.util.Date.from()

public static Date from(Instant instant)

java.util.Date 클래스의 static 메소드인 from() 메소드는

Instant를 파라미터로 받아서, Date 객체로 변환하여 리턴합니다.

 

  예제  

import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.Date;

public class LocalDateToDate {
    public static void main(String[] args) {

        // 1. LocalDate 객체 생성(현재 시간)
        LocalDate localDate = LocalDate.now();

        // 2. LocalDate -> Date 변환
        Instant instant = localDate.atStartOfDay(ZoneId.systemDefault()).toInstant();
        Date date = Date.from(instant);

        // 3. LocalDate, Date 결과 출력
        System.out.println(localDate); // 2021-06-20
        System.out.println(date); // Sun Jun 20 00:00:00 KST 2021
    }
}

Instant instant = localDate.atStartOfDay(ZoneId.systemDefault()).toInstant();

LocalDate 객체를 Instant로 변환하기 위해,

atStartOfDay() 메소드를 이용하여,

LocalDate 객체를 ZonedDateTime 객체로 변환하였습니다.

LocalDate 클래스의 atStartOfDay() 메소드는,

LocalDate가 가리키는 날짜의 가장 이른 시간을 이용하여, ZonedDateTime 클래스를 생성해줍니다.

 

그리고, ZonedDateTime 클래스의 toInstant() 메소드를 이용하여

ZonedDateTime 클래스를 Instant로 변환하였습니다.

 


 

  • Date 객체를 LocalDate, LocalDateTime 객체로 변환하는 방법
  • LocalDate, LocalDateTime 객체를 Date 객체로 변환하는 방법

을 알아보았습니다.

 

 

반응형
Comments