목표
- ZonedDateTime이 날짜, 시간, 시간대로 이루어진 것을 이해한다.
- ZonedDateTime을 생성하고 조작하는 방법을 안다.
개요
앞서 LocalDate, LocalTime, LocalDate Class들에서 우리는 날짜(연, 월, 일)와 시간(시, 분, 초)을 다루는 방법을 살펴보았다. 하지만, 날짜(연, 월, 일)과 시간(시, 분, 초)만으로는 절대값을 갖는 시간이 완성되지 않는다. 그것은 바로 시간대 때문이다. UTC라 불리는 시간대로 인해 한국에서의 저녁 9시는 미국의 새벽 4시이다. 이러한 시간대가 있어야 비로소 절대값을 갖는 시간이 완성된다.
ZonedDateTime Class는 바로 이러한 세가지 요소를 모두 포함하는 Class이다. ZoneDateTime은 그 자체로 절대값을 갖는 시간을 만들어낼 수 있다.
ZonedDateTime의 구성
- 날짜(연, 월, 일)
- 시간(시, 분, 초)
- 시간대(Time Zone)
생성
ZonedDateTime은 날짜와 시간 그리고 시간대가 필요하다. 이전 글에서 날짜, 시간과 관련된 LocalDate, LocalTime, LocalDateTime은 보았다. 이제 남은 것은 시간대와 관련된 클래스이다. 시간대와 관련된 클래스인 ZoneId Class를 먼저 보고 그 다음 이들을 조합하여 ZonedDateTime을 만드는 것을 살펴보도록 하자.
ZoneId Class
ZoneId 는 지역/도시 의 형태의 값을 가지며 아래와 같이 만들 수 있다.
/*서울의 ZoneId 만들기*/
val zoneIdKorea = ZoneId.of("Asia/Seoul");
/*기기의 ZoneId 만들기*/
val defaultZoneId = TimeZone.getDefault().toZoneId();
ZoneId를 이용해 LocalDateTime에 시간대를 추가하여 ZonedDateTime Class를 만들 수 있다.
ZonedDateTime Class
ZonedDateTime Class는 LocalDateTime에 ZoneId의 값을 넣은 클래스이다. 즉, 시간대가 포함된 날짜, 시간 클래스이다.
- LocalDateTime에 ZoneId를 넣을 수 있다.
val dateTime = LocalDateTime.of(2021, 1, 26, 19, 30, 20);
val defaultZoneId = TimeZone.getDefault().toZoneId();
val zonedDateTime = dateTime.atZone(defaultZoneId);
- 기기의 Instant를 받아와 시간대로 변환하여 ZonedDateTime 클래스를 만들 수 있다.
val defaultZoneId = TimeZone.getDefault().toZoneId();
val instant = Instant.now();
val zonedDateTime = instant.atZone(defaultZoneId);
- ZonedDateTime을 Instant로 변환하는 것 또한 가능하다. 이미 시간대가 포함되어 있으므로 별도의 작업을 할 필요가 없다.
반응형