[java] ZonedDateTime과 OffsetDateTime의 차이점은 무엇입니까?

설명서를 읽었지만 여전히 사용해야 할 때 얻을 수 없습니다.

OffsetDateTime데이터베이스에 날짜를 쓸 때 문서를 사용해야하지만 그 이유는 모르겠습니다.



답변

Q : Java 8 ZonedDateTime과 OffsetDateTime의 차이점은 무엇입니까?

javadocs는 다음과 같이 말합니다.

OffsetDateTime, ZonedDateTimeInstant모든 상점 나노초 정밀도 타임 라인에 즉시. Instant단순히 순간을 간단한 표현된다. OffsetDateTime인스턴트하여 현지 날짜와 시간을 얻을 수 있습니다 UTC / 그리니치로부터의 오프셋 (offset).에 추가는 ZonedDateTime풀 타임을 추가 영역 규칙. “

출처 : https://docs.oracle.com/javase/8/docs/api/java/time/OffsetDateTime.html

따라서 후자는 일광 절약 시간 조정 및 기타 여러 가지 예외 사항을 다루는 규칙을 포함한다는 점 OffsetDateTime과 차이점이 ZonedDateTime있습니다.

간단히 말해서 :

시간대 = ( UTC에서 오프셋 + 이상에 대한 규칙)


Q : OffsetDateTime데이터베이스에 날짜를 쓸 때 설명서에 따라 사용해야하지만 그 이유는 모르겠습니다.

현지 시간 오프셋이있는 날짜는 항상 같은 순간을 나타내므로 순서가 안정적입니다. 대조적으로, 전체 시간대 정보가있는 날짜의 의미는 각 시간대에 대한 규칙 조정으로 인해 불안정합니다. (그리고 이러한 일이 발생합니다. 예를 들어 미래의 날짜-시간 값). 따라서 저장하고 검색 ZonedDateTime하면 구현에 문제가 있습니다.

  • 계산 된 오프셋을 저장할 수 있습니다 … 검색 된 객체는 zone-id의 현재 규칙과 일치하지 않는 오프셋을 가질 수 있습니다.

  • 계산 된 오프셋을 버릴 수 있습니다 … 그리고 검색된 객체는 저장된 타임 포인트와 절대 / 유니버설 타임 라인의 다른 포인트를 나타냅니다.

Java 객체 직렬화를 사용하는 경우 Java 9 구현이 첫 번째 접근법을 사용합니다. 이것은 아마도 이것을 처리하는 “보다 정확한”방법이지만 문서화되지 않은 것 같습니다. (JDBC 드라이버와 ORM 바인딩은 아마도 비슷한 결정을 내리고 있으며, 희망을 갖고 올바르게 진행하고 있습니다.)

그러나 날짜 / 시간 값을 수동으로 저장하거나에 의존하는 응용 프로그램을 작성하는 경우 java.sql.DateTimezone-id의 합병증을 다루는 것이 … 피해야 할 것입니다. 따라서 조언.

시간 지남에 따라 의미 / 순서가 불안정한 날짜 는 응용 프로그램에 문제가 될 수 있습니다 . 영역 규칙을 변경하는 것은 어려운 일이므로 예기치 않은 시간에 문제가 발생할 수 있습니다.


조언의 (가능한) 두 번째 이유 ZonedDateTime는 특정 지점에서 a의 구성 이 모호 하기 때문 입니다. 예를 들어, “시계를 다시 놓는”시간에서 현지 시간과 zone-id를 결합하면 서로 다른 두 가지 오프셋을 얻을 수 있습니다. 는 ZonedDateTime지속적으로 다른 통해 하나 선택할 것입니다 …하지만 이것은 항상 올바른 선택이 아니다.

이제는 ZonedDateTime그런 식으로 값을 구성하는 모든 응용 프로그램에서 문제가 될 수 있습니다 . 그러나 엔터프라이즈 응용 프로그램을 작성하는 사람의 관점에서 볼 때 (올바르지 않은) ZonedDateTime값이 지속적이고 나중에 사용될 때 더 큰 문제 입니다.


답변