본문 바로가기
JAVA

자바 타임존 다루기 개념, Java8 날짜와 시간 API

by mingutistory 2022. 8. 6.
728x90

참고
https://meetup.toast.com/posts/125
https://jaimemin.tistory.com/1537
https://perfectacle.github.io/2018/09/26/java8-date-time/

 

Docker, AWS를 이용한 다중 서버, 데이터베이스를 사용하면서 서버 간 시간 동기화 및 데이터 조회가 제대로 안되는 문제가 있어서 해당 부분에 대한 세미나를 들었었는데 정확히 이해를 못 해서 정리해본다.

타임존

국가 별로 또는 면적이 넓은 국가인 경우(ex: 러시아, 미국..) 지역별로 고유하게 가지고 있는 표준시가 같은 지역의 시간대,동일한 시간(시차)을 사용하는 영역을 뜻한다.

GMT

Greenwich Mean Time의 약자로 그리니치 천문대를 기준으로 하는 태양 시간.
한국의 타임존(KST, Korea Standard Time)의 경우 GMT보다 9시간 빠른 영역이다. 이를 GMT+09:00으로 표현한다. 그러니까 GMT00:00 일때 한국은 KST09:00이다.

UTC

GMT와 동일하게 기준 시의 의미를 가지는데 지구 자전주기의 흐름이 늦어지고 있는 문제를 해결하기 위해 정확한 시간 측정을 위해 GMT를 대체하기 위해 제정된 새로운 표준 시이다. 실제로는 아주 미세한 차이 밖에 나지 않는다.
소프트웨어 사용 시에는 GMT보다는 UTC라는 표현을 사용한다.

오프셋(Offset)

UTC를 기준으로 시간이 빠르고 늦음을 표현하는 식이다.
KST의 경우에는 UTC보다 9시간이 빠르기 때문에 KST > UTC+09:00으로 표현 한다.

타임존 1 : 오프셋 N

한 지역의 타임존은 하나 혹은 그 이상의 오프셋을 가지고 해당 지역의 정치, 경제적인 상황에 따라 계속 달라질 수 있다. (ex: 서머 타임..)
우리 나라의 경우에는 오프셋이 UTC+09:00으로 보통 항상 일정하기 때문에 별로 문제가 되지 않지만 오프셋이 변경 될 수도 있기 때문에 해당 개념도 중요한 것으로 보인다.


Java 타임존

2022-02-01 12:00:00 +09:00 Asia/Seoul


LocalDate: 2022-02-01
LocalTime: 12:00:00
LocalDateTime: 2022-02-01 12:00:00


ZoneOffSet: +09:00


OffsetDateTime: 2022-02-01 12:00:00 +09:00


ZoneRegion: Asia/Seoul
ZoneDateTime: 2022-02-01 12:00:00 +09:00 Asia/Seoul

LocalDateTime vs Instant

LocalDateTime

타임존을 가지고 있지 않음, 시간대를 저장하거나 나타내지 않아서 오프셋이 없다.

예를 들어보면 생일과 같은 날짜 + 현지 시간을 결합한 것이다.

오프셋과 같은 표준시와 같은 추가 정보가 제공되지 않는 한 타임라인의 특정 지점을 나타낼 수 없다.

한 지역이나 시간대에 묶이지 않고 하나의 지역 또는 타임존에 얽매이지 않음. 지역성을 부여하기 전에는 의미를 지니지 않는다.

타임라인의 특정 순간이 아닌 대략적인 날짜 혹은 시간을 나타낸다. 실제 사람이 사용하는 시간을 나타내는 API로 Local이라는 단어가 붙은 것을 보면 알 수 있듯이 타임존 정보는 포함하지 않는다.

시간대를 필요하지 않는 작업에서 사용한다.

 

사용 예시로 특정 날짜와 시간을 여러 위치에서 적용하는 경우를 들 수 있다.

2022년 12월 25일 크리스마스 자정 이벤트, 내 생일 파티

예약을 하는 경우

타임존이 정해지지 않은 경우에 사용 할 수 있다.

Instant

타임라인의 특정 지점, 하나의 순간(moment)를 나타낸다. UTC라는 타임라인에 존재하는 하나의 순간으로 nano초 동안의 시간을 나타낸다.

Instant instant = Instatn.now(); // UTC를 통한 현재 순간을 나타냄

서버 운영시 Date 저장 형태는 어떻게 저장해야 할까?

결국 회사에서의 문제점은 Date 데이터를 KST로 저장하고 있었는데 UTC로 시간을 읽어버려서 생기는 문제였다. 그래서 결국에 LocalDateTime 이 형태로 사용했을 때 엉망진창이 되어버렸다.
Instant를 사용하고 UTC 시간을 기준으로 데이터를 저장 할 수 있도록 하자.

300x250

댓글