JavaScript랑 Java의 타임존이 서로 다를 때

YI Eun Gook·2020년 1월 2일
1

JavaScript의 Date랑 Java의 Date는 은근 친하다. 대~충 만들어서 서로 넘겨도 서로 예쁘게 잘 전달된다.
(사실 굉장히 많은 이야기가 생략되었지만);

근데 JavaScript랑 Java의 타임존이 서로 다를 때 쪼끔 문제가 된다. 한 번 보자.

// javascript
const date = new Date('2020-01-01 00:00:00'); // GMT+0900 (한국 표준시)
const params = new URLSearchParams();
params.append('date', date);
const result = await axios.post(url, params);
// java
// TimeZone.setDefault(TimeZone.getTimeZone("America/Bogota"))
public Date date(Date date) {
	return date; // "Tue Dec 31 10:00:00 COT 2019"
}

만약 서버에서 할 일이 클라이언트 시각 기준이라고 하면 별 문제가 되지 않는다.
타임존이 다를 뿐, 서로 같은 시각이니까..

그러니까 클라이언트의 의도가 중요하다.
서버에서 할 일이 서버 시각 기준이라면, 그리고 클라이언트도 그렇게 알고 있다면,
서버에서 "Tue Dec 31 10:00:00 COT 2019"이렇게 받는게 아니고
"Wed Jan 01 00:00:00 COT 2020" 이렇게 받았어야 한다.

즉 클라이언트에서 타임존 정보를 제외하고 보내야 한다.

Locale aware formats

요걸 알기 전에 먼저, JavaScript Date의 toString()을 믿어야 하나 요 글을 한 번 보자.
그렇다.. 믿을 놈이 아닌 것이다.
T_T

  1. Moment.js의 Locale aware formats를 쓴다.
const date = new moment('2020-01-01 00:00:00').format('LLL'); // January 1, 2020 12:00 AM
  1. Date.prototype.getDate() 등으로 Locale aware formats를 직접 구현하기

  2. 클라이언트와 서버 사이에 서로 적당~히 미리 포멧 정해두기
    → 보통 이 방법이 제일 많이 쓰이죠. 사실상 표... 준?;

서버에서 클라이언트로

반대로 서버에서 클라이언트로 데이터를 주는 경우도 있다. 마찬가지의 문제가 발생하고, 마찬가지의 맥락으로 Locale aware formats를 할 수 있다.

spring.jackson.date-format: yyyy-MM-dd HH:mm:ss

jackson 말고 다른 serializer도 비슷한 맥락으로 진행하면 될 듯

profile
= v =?;;

0개의 댓글