WeeklyStudy / modern-java-in-action

Modern Java in Action Study
0 stars 0 forks source link

ZonedDateTime과 OffsetDateTime는 어떤 차이점이 있고 각각 어느 상황에 사용하면 좋을까? #32

Open zuminzi opened 1 year ago

zuminzi commented 1 year ago

문제

ZonedDateTime과 OffsetDateTime은 Java 8에서 제공하는 날짜와 시간 관련 클래스이다. 하지만 ZonedDateTime은 ZoneId로부터 객체를 생성하고, OffsetDateTime은 ZoneId의 서브클래스인 ZoneOffset으로부터 객체를 생성한다. ZonedDateTime과 OffsetDateTime를 비교하며 두 클래스에 대한 이해도를 높이면 좋을 것 같다.

ZonedDateTime과 OffsetDateTime는 어떤 차이점이 있고 각각 어느 상황에 사용하면 좋을까?

관련 목차

참고자료

zuminzi commented 1 year ago

답변

1. ZoneId vs ZoneOffset

ZoneId

ZoneId는 "Time-Zone(시간대) ID"를 의미한다. 이는LocalDateTimeInstant 간의 변환 규칙을 식별하는 데 사용된다.

ID에는 아래와 같이 두 가지 유형이 있다.

ZoneId는 UTC로부터의 시간 차이를 Time-Zone code로 나타내는데, UTC로부터의 고정된 오프셋뿐만 아니라 일광 절약 시간 변경 규칙도 포함한다. (ID 유형 중 고정 오프셋은 대부분 ZoneOffset으로 나타낸다.)


ZoneOffSet

ZoneOffset은 "시차", 즉 UTC로부터의 고정된 시간 차이양수나 음수로 나타낸다.


ZoneId와 ZoneOffSet 예시

💡 타임존(Time-Zone)
  • Time-Zone은 여러 가지 다른 것을 설명하는 데 사용할 수 있지만 대개 지역 또는 국가의 현지 시간을 나타내며, 주로 해당 국가에 의해 법적으로 지정된다.
  • Time-Zone은 ZoneId 클래스를 통해 날짜/시간별 DST가 반영되었는지 확인할 수도 있는데, ZoneId.getAvailableZoneIds() 를 통해 지원하는 지역별 타임존을 확인할 수 있다(2018년 2월에 등록된 ZoneId는 600개였다).
💡 DST(Daylight Saving time)
  • DST은 자연 일광을 보다 잘 활용하기 위해서 여름철에 표준 시간에서 1시간 앞으로, 그리고 다시 가을에 시간을 1시간 전으로 설정하는 것을 말한다.
  • "Summer Time"이라고 불리기도 하며, DST가 적용되지 않는 표준시는 "winter time"이라고 불리기도 한다.


2. ZonedDateTime vs OffsetDateTime

ZonedDateTimeOffsetDateTime 모두 자바에서 시간을 나노초 단위로 저장하는 클래스다. 그러나 이 둘은 시간대와 오프셋 처리 방식에서 차이가 있다.

ZonedDateTime

ZonedDateTimeLocalDateTimeZoneId를 결합하여 전체 시간대(Time-Zone) 정보를 제공한다. 따라서 이를 통해 일광 절약 시간(DST) 조정 및 기타 시간대 관련 이상 현상을 처리할 수 있다.

DST에는 CET(겨울), CEST(여름) 형태가 있는데 Time Zone(CET)로 통일하고, Time Transition Rule을 가지는 ZoneRules를 통해 알아서 내부적으로 계산해준다.

따라서, DST 등으로 인해 고정된 시차를 가지지 않는 도시를 대상으로 날짜 시간 객체를 만들 땐 ZonedDateTime 을 사용하는 것이 적합하다. 계절에 따라 변하는 시차를 알아서 처리해주기 때문이다. 예를 들어 벤쿠버의 경우, 보통은 시차가 -08:00이지만 DST를 시행하기 때문에 여름에는 한 시간 더 일찍 시간이 간다.


OffsetDateTime

OffsetDateTime은 LocalDateTime과 고정된 ZoneOffset을 결합한 클래스다. 즉, 이 클래스는 일광 절약 시간(DST) 조정이나 다른 이상 현상 없이 시간을 표현한다.

공식 API 문서에 따르면, 데이터베이스네트워크와 상호작용할 때는 OffsetDateTime 사용이 권장된다. 현지 시간 오프셋이 있는 OffsetDateTime는 항상 동일한 순간을 나타내므로 순서가 안정적이기 때문이다. 반면, 전체 시간대 정보를 포함하는 ZonedDateTime는 해당 시간대에 대한 규칙 조정에도 불구하고 불안정하다. ZonedDateTime을 저장하고 검색할 경우, 저장된 computed offset과 검색된 객체의 offset이 zone-id의 현재 규칙과 일치하지 않는 문제가 발생할 수 있기 때문이다.


3. 결론

References