프로그래밍 언어/JAVA

java.time.LocalDateTime과 java.util.Date 간 변환

Rateye 2021. 11. 24. 12:33
728x90
반응형
질문 : java.time.LocalDateTime과 java.util.Date 간 변환

Java 8에는 날짜 및 시간에 대한 완전히 새로운 API가 있습니다. 이 API에서 가장 유용한 클래스 중 하나는 시간대와 무관 한 날짜-시간 값을 보유하기위한 LocalDateTime

java.util.Date 를 사용하는 코드는 수백만 줄이 될 것입니다. 따라서 이전 코드와 새 코드를 연결할 때 둘 사이를 변환해야합니다. 이를 달성하기위한 직접적인 방법이없는 것처럼 보이지만 어떻게 할 수 있습니까?

답변

짧은 답변:

Date in = new Date();
LocalDateTime ldt = LocalDateTime.ofInstant(in.toInstant(), ZoneId.systemDefault());
Date out = Date.from(ldt.atZone(ZoneId.systemDefault()).toInstant());

설명 : ( LocalDate 에 대한이 질문을 기반으로 함)

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

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

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

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

Instant 에는 시간대에 대한 정보도 포함되어 있지 않습니다. Instant 에서 로컬 날짜-시간으로 변환하려면 시간대를 지정해야합니다. 이는 기본 영역 ZoneId.systemDefault() 이거나 사용자 환경 설정의 시간대와 같이 애플리케이션이 제어하는 시간대 일 수 있습니다. LocalDateTime 에는 인스턴트 및 시간대를 모두 취하는 편리한 팩토리 메서드가 있습니다.

Date in = new Date();
LocalDateTime ldt = LocalDateTime.ofInstant(in.toInstant(), ZoneId.systemDefault());

반대로 LocalDateTime atZone(ZoneId) 메서드를 호출하여 시간대를 지정합니다. ZonedDateTime Instant 로 직접 변환 할 수 있습니다.

LocalDateTime ldt = ...
ZonedDateTime zdt = ldt.atZone(ZoneId.systemDefault());
Date output = Date.from(zdt.toInstant());

LocalDateTime 에서 ZonedDateTime 변환하면 예기치 않은 동작이 발생할 가능성이 있습니다. 이는 일광 절약 시간으로 인해 모든 현지 날짜-시간이 존재하는 것은 아니기 때문입니다. 가을 / 가을에는 동일한 현지 날짜-시간이 두 번 발생하는 현지 타임 라인에 겹치는 부분이 있습니다. 봄에는 한 시간이 사라지는 간격이 있습니다. 변환이 수행 할 작업에 대한 자세한 정의 atZone(ZoneId) 의 Javadoc을 참조하십시오.

당신이 왕복 경우 요약, java.util.Date A와 LocalDateTime 다시와 java.util.Date 당신으로 인해 일광 절약 시간에 다른 순간에 끝낼 수 있습니다.

추가 정보 : 아주 오래된 날짜에 영향을 미치는 또 다른 차이점이 있습니다. java.util.Date 는 1582 년 10 월 15 일에 변경되는 달력을 사용하며 그 이전의 날짜는 그레고리력 대신 율리우스 력을 사용합니다. 반대로, java.time.* 는 항상 ISO 달력 시스템 (그레고리 안과 동일)을 사용합니다. 대부분의 사용 사례에서 ISO 달력 시스템은 사용자가 원하는 것이지만 1582 년 이전 날짜를 비교할 때 이상한 효과가 나타날 수 있습니다.

출처 : https://stackoverflow.com/questions/19431234/converting-between-java-time-localdatetime-and-java-util-date
728x90
반응형