ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • jvm 시간대
    글또 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 시간을 뺍니다

    댓글

Designed by Tistory.