Java 8 ZonedDateTime vs OffsetDateTime 어떤 상황에서 쓰는게 적합한가?
들어가기 전에
- 본 글은 회사 팀 내 세션 공유용 자료이며 이전 글 내용과 이어집니다.
OffsetDateTime
OffsetDateTime
은 (LocalDateTime(날짜 + 시간) + ZoneOffset) 을 포함한다Instant
와 같이 나노초 정밀도로 타임라인에 순간을 저장한다UTC/그리니치
에서 오프셋을 추가하면 현지 날짜-시간을 얻을 수 있다.- 데이터베이스에
Timestamp
를 저장하거나 네트워크를 통해 XML 문서에Timestamp
를 통신하는 데 사용하는 것이 유리하다고 한다.
ZoneOffset
- UTC 기준 시간을 표현한 것
- 우리나라
Timezone(Asia/Seoul)
기준UTC +09:00
로 표기 ZoneOffset
은ZoneId
를 상속 받았다.
ZonedDateTime
ZonedDateTime
은 (OffsetDateTime + ZoneRegion)를 포함한다.ZoneRegion
은Timezone
을 나타낸 것이라고 보면된다. (ex.Asia/Seoul
)ZoneRegion
은ZoneId
를 상속 받았다.
2022-08-19T22:36:41.559512100+09:00[Asia/Seoul]
와 같이 ISO-8601 달력 시스템 표준대를 따라서 표기한다.Instant
와 같이 나노초 정밀도로 타임라인에 순간을 저장한다.- 여기까지만 보면
OffsetDateTime
과 차이가 무엇이냐는 궁금증이 있을 수 있다.Asia/Seoul
을 쓰건Asia/Tokyo
를 쓰건 어차피UTC+09
인데 뭔 상관이냐?OffsetDateTime
과 달리ZonedDateTime
은 DST(Daylight Saving Time) 와 같은 써머 타임의 정보(ZoneRules
로 판단)가 들어가 있다. 이 이유가 가장 크다- DST를 사용하는 지역
- DST를 한번도 사용 안한 지역
- 과거에는 시행했지만 사용하지 않는 지역
이렇게 지역이 3가지 분류로 나뉠 때 혼란스러워진다. 또한 CET(중앙유럽 표준시) 와 CEST(중앙유럽 일광 절약 시간대) 를 사용 유무에 따라 계산하기 매우 까다롭다.
- 이러한 부분을
ZoneRules
로 DST를 완전히 인식하고 처리한다. - java는 CET와 CEST를 CET로 통일한다
코드로 알아보자 1월CET
, 6월CET
를 비교해보자 -
ZonedDateTime winter = ZonedDateTime.of(2022, 1, 1, 0, 0, 0, 0, ZoneId.of("CET")); System.out.println("winter = " + winter); ZonedDateTime summer = ZonedDateTime.of(2022, 6, 1, 0, 0, 0, 0, ZoneId.of("CET")); System.out.println("summer = " + summer); winter = 2022-01-01T00:00+01:00[CET] summer = 2022-06-01T00:00+02:00[CET]
- 예상 했던 것과 다르게 같은 Offset이 찍히지 않는다.
OffsetDateTime
은 이런 디테일한 부분을 처리할 수 없다.
결론
- 데이터베이스나 네트워크를 통신하는데 사용하기에는
OffsetDateTime
을 사용하는 것이 적절하고 글로벌 서비스에서는ZonedDateTime
을 사용하는 것이 더욱 바람직하다고 생각한다.
Reference
- https://stackoverflow.com/questions/30234594/whats-the-difference-between-zoneddatetime-and-offsetdatetime
- https://docs.oracle.com/javase/8/docs/api/java/time/ZonedDateTime.html
- https://docs.oracle.com/javase/8/docs/api/java/time/OffsetDateTime.html
- https://www.baeldung.com/java-zoneddatetime-offsetdatetime
- https://howtodoinjava.com/java/date-time/zoneddatetime-vs-offsetdatetime/
'Java > 개념' 카테고리의 다른 글
Java 8 LocalDateTime vs Instant 어떤 상황에서 쓰는게 적합한가? (0) | 2022.08.09 |
---|---|
Java 메모리 최적화가 어떻게 되는지 과정 (0) | 2021.02.25 |
JVM 동적 클래스 로딩 (0) | 2021.02.24 |
[Java] Java 8에 추가된 LocalDate, LocalTime, LocalDateTime (0) | 2020.11.02 |
[Java] Date, Calendar클래스가 왜 Deprecated됐는지? (0) | 2020.11.02 |