Hello

[Java]타임존 처리 ZonedDateTime + moment-timezone 본문

java

[Java]타임존 처리 ZonedDateTime + moment-timezone

nari0_0 2024. 1. 17. 18:16
728x90

기준시간을 UTC로 사용하고 사용자가 설정한 타임존에 맞춰 시간을 표시하고 처리가 필요했다. ZonedDateTime, moment-timezone js 를 사용해 서버-클라이언트 처리한 내용을 간단하게 정리하려고 함.

 

ZonedDateTime 날짜-시간과 시간대 값을 가진 객체이다. ex) 2021-08-01T00:00+09:00[Asia/Seoul]

타임존

  • 서버 : UTC
  • 클라이언트 : 개별 타임존

시간 포맷은 'YYYY-MM-DDTHH:mm:ssZ' 사용.

클라이언트 -> 서버

클라이언트

  • 클라이언트가 로드 될 때 설정한 타임존을 moment default timezone 설정
  • 선택한 날짜-시간 값을 moment-timezone을 사용해 타임존 적용
  • format() 함수 사용 시 패턴을 입력하지 않아도 내부적으로 utc 인지 아닌지 판단해 알아서 변환해줌.
    function format(inputString) {
        if (!inputString) {
            inputString = this.isUtc()
                ? hooks.defaultFormatUtc //"YYYY-MM-DDTHH:mm:ss[Z]"
                : hooks.defaultFormat; //"YYYY-MM-DDTHH:mm:ssZ"
        }
        var output = formatMoment(this, inputString);
        return this.localeData().postformat(output);
    }

ex)

moment.tz.setDefault('Asia\/Seoul'); //전역 적용
moment('2024-02-08T12:07:48').format(); //'2024-02-08T12:07:48+09:00'

 

서버

클라이언트에서 전달받은 날짜를 ZonedDateTime 역직렬화 할 때, timezone 옵션을 설정하지 않았다면 Jackson default timezone UTC를 사용해 변환 합니다.

BaseSettings.class
BaseSettings.class

'2024-02-08T12:07:48+09:00' 전송시 서버에서 UTC로 변환된 것 확인

서버 -> 클라이언트 

서버에서 ZonedDateTime 그대로 전달 ex) 2024-02-08T03:07:48Z, 2024-02-08T03:07:48+8:00

 

클라이언트에서 설정된 타임존으로 데이터를 확인 할 수 있도록 변환

moment('2024-02-08T03:07:48Z').format('YYYY-MM-DD HH:mm:ss'); //2024-02-08 12:07:48

UTC로 변환 되는 이유

spring.jackson.deserialization.adjust-dates-to-context-time-zone 옵션 기본값은 true이다
기본 값으로 설정 되어 있다면,jackson에 설정된 값과 다른 타임존 정보가 넘어오면 재정의 한다.
jackson 타임존 설정을 하지않으면 UTC를 사용한다.
spring.jackson.time-zone=Asia/Hong_Kong 설정을 하면 클라이언트에서 넘어온 타임존을 Asia/Hong_Kong로 변환한
다.

false 설정 시 클라이언트에서 넘어온 그대로 값을 가진다.
아래 이미지를 확인해 보면 각각의 시간대 값으로 매핑된 것을 확인할 수 있다.

 

false옵션

 

참고 : 

https://ko.wikipedia.org/wiki/ISO_8601

https://fasterxml.github.io/jackson-databind/javadoc/2.9/com/fasterxml/jackson/databind/DeserializationFeature.html#ADJUST_DATES_TO_CONTEXT_TIME_ZONE

https://stackoverflow.com/questions/34764355/jackson-deserialization-issue-for-zoneddatetime

728x90