Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- @CreateDate
- EmbeddedId
- deserializer
- getEntityGraph
- apatch poi
- https
- @EntityListeners
- +9:00
- createEntityGraph
- load order
- 버전 문자열 비교
- mysql =
- 1*1000
- Protecle
- getDateCellValue
- AuditingEntityListener
- 오블완
- spring boot
- MYSQL
- RootGraph
- sendFractionalSeconds
- NamedEntityGraph
- fractional seconds
- MSSQL
- mysql not equal null
- mysql equal null
- 티스토리챌린지
- pooled-lo
- yml
- 운동해서 광명찾자
Archives
- Today
- Total
Hello
[Java]타임존 처리 ZonedDateTime + moment-timezone 본문
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를 사용해 변환 합니다.
'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 설정 시 클라이언트에서 넘어온 그대로 값을 가진다.
아래 이미지를 확인해 보면 각각의 시간대 값으로 매핑된 것을 확인할 수 있다.
참고 :
https://ko.wikipedia.org/wiki/ISO_8601
https://stackoverflow.com/questions/34764355/jackson-deserialization-issue-for-zoneddatetime
728x90
'java' 카테고리의 다른 글
local에서 keytool or portecle 사용해 인증서 생성 및 ssl 적용 (0) | 2024.02.01 |
---|---|
Java TimeUnit (0) | 2024.01.30 |
[JPA] 하위 그래프가 하위 그래프를 사용하는 방법 (0) | 2024.01.11 |
[JPA] Service Layer 에서 DataIntegrityViolationException 처리 (0) | 2024.01.10 |
[JPA] PK가 아닌 컬럼을 사용하여 연관관계 설정 (0) | 2024.01.03 |