Back-end/Java, Kotlin

Java ZoneDateTime 에 대해서

philo0407 2023. 5. 8. 23:34

public domain image

 

GMT, UTC부터 이해하면 많은 도움이 된다

우선 둘은 거의 동일한 용어이다

(실제로는 둘 사이의 시차가 몇미리초 정도 차이가 난다고 한다)

초기에는 영국에서 그리니치 천문시를 만들고 (GMT) 후에 UTC가 되었다

 

영국시 기준으로 0시라 가정할 때 우리나라는 상대적으로 +9시간을 더해서 시차를 계산한다

 

단순히 일시를 나타내는 LocalDateTime과는 달리 ZoneDateTime은 Zone에 따른 시차까지 고려한다

 

ZoneDateTime은 크게 두가지 정보

ZoneId는 아시아/서울 등의 지역 정보

ZoneOffset은 +9 등의 단순 시각 정보를 갖는다

ZoneOffset은 ZoneId를 상속한다

 

 

존이 다르더라도 epoch 시각으로 변환해서 대소관계를 비교할 수 있다 (isEqual()를 사용해야한다)

class ZoneDateTimeTest : StringSpec({

    val 한국_타임_존: ZoneId = ZoneId.of("Asia/Seoul")
    val 영국_타임_존: ZoneId = ZoneId.of("Europe/London")

    "한국시와 영국시가 같은 경우" {

        val 한국_일시 = ZonedDateTime.of(LocalDateTime.of(2023, 1, 31, 3, 0), 한국_타임_존)
        val 영국_일시 = ZonedDateTime.of(LocalDateTime.of(2023, 1, 30, 18, 0), 영국_타임_존)

        한국_일시.isEqual(영국_일시) shouldBe true
        한국_일시.equals(영국_일시) shouldBe false // equal은 Zone까지 확인한다
    ,

    "한국시가 영국시보다 느린 경우" {

        val 한국_일시 = ZonedDateTime.of(LocalDateTime.of(2023, 1, 31, 3 + 1, 0), 한국_타임_존)
        val 영국_일시 = ZonedDateTime.of(LocalDateTime.of(2023, 1, 30, 18, 0), 영국_타임_존)

        한국_일시.isAfter(영국_일시) shouldBe true
    }

    "한국시가 영국시보다 빠른 경우" {

        val 한국_일시 = ZonedDateTime.of(LocalDateTime.of(2023, 1, 31, 3 - 1, 0), 한국_타임_존)
        val 영국_일시 = ZonedDateTime.of(LocalDateTime.of(2023, 1, 30, 18, 0), 영국_타임_존)

        한국_일시.isBefore(영국_일시) shouldBe true
    }
})

 

참고

The World Clock — Worldwide (timeanddate.com)

[Java8 Time API] ZonedDateTime 사용법 | Engineering Blog by Dale Seo

협정 세계시 - 나무위키 (namu.wiki)