질문 : 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
'프로그래밍 언어 > JAVA' 카테고리의 다른 글
자바 HashMap을 통해 반복하는 방법 (0) | 2021.11.26 |
---|---|
Try / Catch를 사용하지 않고 JavaScript에서 문자열이 유효한 JSON 문자열인지 확인하는 방법 (0) | 2021.11.26 |
Java 배열을 출력하는 가장 간단한 방법 (0) | 2021.11.24 |
JavaBean의 역할 (0) | 2021.11.24 |
JavaScript에서 이메일 주소를 확인하는 방법 (정규식) (0) | 2021.11.24 |