글또

jvm 시간대

Gisungcu 2022. 7. 18. 23:13

자바에서 시간대를 얻기 위해 사용하는 class들이 여러 개 있습니다.
이번 글에서는 자바 8에 추가된 instant와 localDateTime을 알아보겠습니다.


UTC : 세계 협정시. 1970.01.01 이후부터 시행된 표준시
https://ko.wikipedia.org/wiki/%ED%98%91%EC%A0%95_%EC%84%B8%EA%B3%84%EC%8B%9C

 

협정 세계시 - 위키백과, 우리 모두의 백과사전

 

ko.wikipedia.org


Instant는 UTC이후 경과된 나노초를 나타냅니다.
LocalDateTime은 표준시간대 없이 시각을 나타냅니다.

now를 찍어보면 그 차이를 알 수 있습니다.
한국은 UTC +9:00 이기에 localDatetime에는 instant보다 9시간 더해진 것을 알 수 있습니다.

둘의 성격이 다르듯 제공되는 메소드도 다릅니다.

instant의 경우 UTC를 기준으로 얼마나 지났는지에 대한 메서드가 많은 반면

localDateTime은 특정 날짜, 시간을 나타낼 수 있습니다.

now() 내부 구현은 어떻게 되어 있을까요?


instant는 내부에서 해당 파이널 필드를 사용해 객체를 생성합니다.


LocalDateTime는 해당 시스템의 default time zone을 사용합니다.

 

무엇을 사용해야할까요?

instant : 특정 행위가 일어난 시각을 나타낼 수 있습니다. 날짜와 시간의 정보를 조작하기보다는 특정 시점의 타임스탬프로 활용합니다.
localDateTime : 특정 날짜, 시각을 나타낼 수 있습니다.

 

단점은 무엇이 있을까요?

저는 instant를 사용하다 보니 몇 가지 불편한 점이 있었습니다.
예로 string 타입 변환이 귀찮습니다.
string -> localDate -> Intant 형식으로 변경해줘야 합니다.

val parse = LocalDate.parse(date, DateTimeFormatter.ofPattern("yyyyMMdd"))
val atZone = parse.atStartOfDay().atZone(ZoneId.of("UTC"))


해당 문제는 json 변환으로 이어집니다.
외부에서 yyyyMMdd와 같은 형태로 들어온다면
@JsonFormat(pattern = "yyyyMMdd")를 사용할 수 없고 직접 역직렬화를 해주는 class를 생성해야 합니다.

시간대가 필요하지만 없기 때문입니다.

고려할 점

data base에 insert 시 시간대를 고려하십시오.
ex) jvm은 kst, db는 utc일 경우. application에서 insert될 때 jdbc 드라이버는 시간대를 맞추기 위해 +9:00 시간을 뺍니다