프로그래밍 언어/JAVA

java.util.Date를 java.time.LocalDate로 변환하는 방법

Rateye 2021. 12. 9. 10:47
728x90
반응형
질문 : java.util.Date를 java.time.LocalDate로 변환

java.util.Date 객체를 새로운 JDK 8 / JSR-310 java.time.LocalDate 로 변환하는 가장 좋은 방법은 무엇입니까?

Date input = new Date();
LocalDate date = ???
답변

짧은 답변

Date input = new Date();
LocalDate date = input.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();

설명

이름에도 불구하고 java.util.Date 는 "날짜"가 아니라 타임 라인의 순간을 나타냅니다. 객체 내에 저장된 실제 데이터는 1970-01-01T00 : 00Z (1970 년 GMT / UTC 시작 자정) 이후 long

JSR-310의 java.util.Date 에 해당하는 클래스 Instant 이므로 변환을 제공 toInstant() 메소드가 있습니다.

Date input = new Date();
Instant instant = input.toInstant();

java.util.Date 인스턴스에는 시간대 개념이 없습니다. toString 이 시간대에 상대적이기 때문에 java.util.Date toString() 을 호출하면 이상하게 보일 수 있습니다. 그러나이 방법은 실제로 Java의 기본 시간대를 사용하여 문자열을 제공합니다. java.util.Date 의 실제 상태의 일부가 아닙니다.

Instant 에는 시간대에 대한 정보도 포함되어 있지 않습니다. Instant 에서 현지 날짜로 변환하려면 시간대를 지정해야합니다. 이는 기본 영역 ZoneId.systemDefault() 이거나 사용자 환경 설정의 시간대와 같이 애플리케이션이 제어하는 시간대 일 수 있습니다. atZone() 메서드를 사용하여 시간대를 적용합니다.

Date input = new Date();
Instant instant = input.toInstant();
ZonedDateTime zdt = instant.atZone(ZoneId.systemDefault());

ZonedDateTime 에는 현지 날짜 및 시간, 시간대 및 GMT / UTC로부터의 오프셋으로 구성된 상태가 포함됩니다. 따라서 날짜 ( LocalDate toLocalDate() 사용하여 쉽게 추출 할 수 있습니다.

Date input = new Date();
Instant instant = input.toInstant();
ZonedDateTime zdt = instant.atZone(ZoneId.systemDefault());
LocalDate date = zdt.toLocalDate();

자바 9 답변

Java SE 9에는이 작업을 약간 단순화 하는 새로운 메소드가 추가되었습니다.

Date input = new Date();
LocalDate date = LocalDate.ofInstant(input.toInstant(), ZoneId.systemDefault());

이 새로운 대안은 더 직접적이고 쓰레기를 덜 생성하므로 더 나은 성능을 발휘해야합니다.

출처 : https://stackoverflow.com/questions/21242110/convert-java-util-date-to-java-time-localdate
728x90
반응형