Open zuminzi opened 1 year ago
ZoneId
는 "Time-Zone(시간대) ID"를 의미한다. 이는LocalDateTime
과 Instant
간의 변환 규칙을 식별하는 데 사용된다.
ID에는 아래와 같이 두 가지 유형이 있다.
ZoneId
는 UTC로부터의 시간 차이를 Time-Zone code로 나타내는데, UTC로부터의 고정된 오프셋뿐만 아니라 일광 절약 시간 변경 규칙도 포함한다. (ID 유형 중 고정 오프셋은 대부분 ZoneOffset
으로 나타낸다.)
ZoneOffset
은 "시차", 즉 UTC로부터의 고정된 시간 차이를 양수나 음수로 나타낸다.
Asia/Seoul
이고, 시차는 +09:00
이다.
ZoneId seoulZoneId = ZoneId.of("Asia/Seoul");
ZoneOffset seoulZoneOffset = ZoneOffset.ofHours(9);
예시 2: 시차가 +0:00
인 경우, OffsetDateTime는 UTC를 기준으로 하는 Instant와 동일한 순간을 나타낸다.
ZoneOffset zeroOffset = ZoneOffset.ofHours(0);
OffsetDateTime offsetDateTime = OffsetDateTime.now(zeroOffset);
// 위 코드 두 줄은 아래 코드 한 줄과 동일하다.
Instant instant = Instant.now();
💡 타임존(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"이라고 불리기도 한다.
ZonedDateTime
과 OffsetDateTime
모두 자바에서 시간을 나노초 단위로 저장하는 클래스다. 그러나 이 둘은 시간대와 오프셋 처리 방식에서 차이가 있다.
ZonedDateTime
는 LocalDateTime
과 ZoneId
를 결합하여 전체 시간대(Time-Zone) 정보를 제공한다. 따라서 이를 통해 일광 절약 시간(DST) 조정 및 기타 시간대 관련 이상 현상을 처리할 수 있다.
DST에는 CET(겨울), CEST(여름) 형태가 있는데 Time Zone(CET)로 통일하고, Time Transition Rule을 가지는 ZoneRules
를 통해 알아서 내부적으로 계산해준다.
따라서, DST 등으로 인해 고정된 시차를 가지지 않는 도시를 대상으로 날짜 시간 객체를 만들 땐 ZonedDateTime
을 사용하는 것이 적합하다. 계절에 따라 변하는 시차를 알아서 처리해주기 때문이다.
예를 들어 벤쿠버의 경우, 보통은 시차가 -08:00
이지만 DST를 시행하기 때문에 여름에는 한 시간 더 일찍 시간이 간다.
OffsetDateTime은 LocalDateTime과 고정된 ZoneOffset을 결합한 클래스다. 즉, 이 클래스는 일광 절약 시간(DST) 조정이나 다른 이상 현상 없이 시간을 표현한다.
공식 API 문서에 따르면, 데이터베이스나 네트워크와 상호작용할 때는 OffsetDateTime
사용이 권장된다.
현지 시간 오프셋이 있는 OffsetDateTime
는 항상 동일한 순간을 나타내므로 순서가 안정적이기 때문이다. 반면, 전체 시간대 정보를 포함하는 ZonedDateTime
는 해당 시간대에 대한 규칙 조정에도 불구하고 불안정하다. ZonedDateTime
을 저장하고 검색할 경우, 저장된 computed offset과 검색된 객체의 offset이 zone-id의 현재 규칙과 일치하지 않는 문제가 발생할 수 있기 때문이다.
ZonedDateTime
이 유용하다.
OffsetDateTime
을 사용한다.
문제
ZonedDateTime과 OffsetDateTime은 Java 8에서 제공하는 날짜와 시간 관련 클래스이다. 하지만 ZonedDateTime은 ZoneId로부터 객체를 생성하고, OffsetDateTime은 ZoneId의 서브클래스인 ZoneOffset으로부터 객체를 생성한다. ZonedDateTime과 OffsetDateTime를 비교하며 두 클래스에 대한 이해도를 높이면 좋을 것 같다.
ZonedDateTime과 OffsetDateTime는 어떤 차이점이 있고 각각 어느 상황에 사용하면 좋을까?
관련 목차
참고자료