programing

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

goodcopy 2022. 7. 19. 21:41
반응형

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

매뉴얼을 읽었는데도 어느쪽을 사용해야 하는지 알 수 없습니다.

문서 문서에에 따르면 따라OffsetDateTime때 이에 날짜를 쓰고, 하지만 왜 받지 않아 사용되어야 합니다.데이터베이스에 날짜를 쓸 때 사용해야 하는데 왜 그런지 모르겠어요.

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

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

""OffsetDateTime,,ZonedDateTime그리고 그리고.Instant모든 나노초 정밀에 시각표.에 즉시 저장한다.모두 타임라인에 나노초 단위로 한 순간을 저장합니다. Instant는 것은, 인스턴트를 나타내는 단순한 있다.가장 단순하고,단순히 순간을 표현합니다. OffsetDateTime이 즉석에 추가합니다 UTC/Greenwich한 국내 date-time 할 수 있다는 점에서 오프셋입니다.는 UTC/Greenwich로부터의 오프셋을 추가합니다.이것에 의해, 로컬의 날짜 시각을 취득할 수 있습니다. ZonedDateTime전체 표준 시간대 규칙을 추가합니다."풀타임존 규칙을 추가합니다.

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

따라서 따라서 사이의 차이점가지 차이입니다 두 이.OffsetDateTime ★★★★★★★★★★★★★★★★★」ZonedDateTime후자는 여름 시간 조정 및 기타 다양한 이상 현상을 다루는 규칙을 포함하고 있습니다.

간단히 말하면:

시간대 = (Offset-From-UTC + Rules-For-Anomalies )


에 따르면 Q: 뉴뉴 q 。OffsetDateTime데이터베이스에 날짜를 쓸 때 사용해야 하는데 왜 그런지 모르겠어요.

로컬 시간 간격띄우기가 있는 날짜는 항상 동일한 시간 인스턴스를 나타내므로 순서가 안정적입니다.반면, 완전한 시간대 정보를 가진 날짜의 의미는 각 시간대 규칙에 대한 조정에 직면하여 불안정하다(그리고 이러한 일이 일어난다. 「」를 참조해 주세요., 「」를 하면,ZonedDateTime구현에 문제가 있습니다.

  • 계산된 오프셋을 저장할 수 있습니다.그러면 취득된 오브젝트는 존 ID의 현재 규칙과 일치하지 않는 오프셋을 가질 수 있습니다.

  • 계산된 오프셋 ...을 폐기할 수 있습니다.그러면 검색된 개체는 절대/범용 타임라인에서 저장된 포인트와 다른 포인트를 나타냅니다.

Java 오브젝트의 시리얼화를 사용하는 경우 Java 9 구현은 첫 번째 접근방식을 취합니다.이것이 이 문제를 해결하는 "더 올바른" 방법이라고 할 수 있지만, 문서화된 것은 아닌 것 같습니다.(JDBC 드라이버와 ORM 바인딩도 아마 비슷한 결정을 내리고 있으며 올바르게 처리되기를 바랍니다.)

, 날짜을 수동으로 에하는 java.sql.DateTimezone-id의 복잡성에 대처하는 것은 아마 피해야 할 것입니다.그래서 충고입니다.

시간 경과에 따라 의미/순서가 불안정한 날짜는 응용 프로그램에 문제가 수 있습니다.또한 존 규칙의 변경은 엣지 케이스이기 때문에 예기치 않은 타이밍에 문제가 발생하기 쉽습니다.


이 조언의 두 번째 이유(가능성이 있는)는 다음과 같은 구성입니다.ZonedDateTime모호한 점이 있습니다.예를 들어, "클럭을 되돌리는" 기간에 로컬 시간과 존 ID를 조합하면 두 가지 다른 오프셋을 얻을 수 있습니다.ZonedDateTime항상 둘 중 하나를 선택하겠지만 항상 옳은 선택은 아닙니다

이 문제는 다음 구성 요소를 구성하는 모든 애플리케이션에 문제가 될 수 있습니다.ZonedDateTime그런 식으로 가치관을요.그러나 엔터프라이즈 애플리케이션을 구축하는 사람의 관점에서는 (잘못될 수 있음)이 더 큰 문제가 됩니다.ZonedDateTime값은 고정되며 나중에 사용됩니다.

수용된 답변은 매우 상세한 설명을 제공하며, 아마도 아래 코드 예시는 짧고 명확한 그림을 제공할 수 있습니다.

Instant instant = Instant.now();
Clock clock = Clock.fixed(instant, ZoneId.of("America/New_York"));
OffsetDateTime offsetDateTime = OffsetDateTime.now(clock);
ZonedDateTime zonedDateTime = ZonedDateTime.now(clock);

System.out.println(offsetDateTime); // 2019-01-03T19:10:16.806-05:00
System.out.println(zonedDateTime);  // 2019-01-03T19:10:16.806-05:00[America/New_York]
System.out.println();

OffsetDateTime offsetPlusSixMonths = offsetDateTime.plusMonths(6);
ZonedDateTime zonedDateTimePlusSixMonths = zonedDateTime.plusMonths(6);

System.out.println(offsetPlusSixMonths); // 2019-07-03T19:10:16.806-05:00
System.out.println(zonedDateTimePlusSixMonths); // 2019-07-03T19:10:16.806-04:00[America/New_York]
System.out.println(zonedDateTimePlusSixMonths.toEpochSecond() - offsetPlusSixMonths.toEpochSecond()); // -3600

System.out.println();
System.out.println(zonedDateTimePlusSixMonths.toLocalDateTime()); // 2019-07-03T19:10:16.806
System.out.println(offsetPlusSixMonths.toLocalDateTime()); // 2019-07-03T19:10:16.806

요컨대, 사용ZonedDateTime일광 절약 시간을 고려하는 경우에만 일반적으로 위의 예에서 볼 수 있듯이 1시간 차이가 있습니다. 오프셋은ZonedDateTime에서 바꾸다.-5:00로.-04:00대부분의 경우 비즈니스 로직이 버그로 끝날 수 있습니다.

(https://www.youtube.com/watch?v=nEQhx9hGutQ)에서 코드 복사).

언급URL : https://stackoverflow.com/questions/30234594/whats-the-difference-between-zoneddatetime-and-offsetdatetime

반응형