우리는 한다, 개발을.

time-zone 이슈

⌛ 2 mins

맞닥뜨렸다! 타임 존 이슈!


toISOString

날짜를 2024-01-10 형식으로 이쁘게 문자열 화 시키고 싶어서 ISOString을 사용했고, 문제를 발견했다.

Untitled

상단 - 현재 시간

하단 - toISOString 적용 시간

⇒ 9시간의 시간 차가 생겼다.

  • 시간 차가 생긴 원인 참조

    JavaScript에서 new Date()를 사용할 때 시간 차이가 발생하는 경우에는 주로 시간대(time zone)의 영향이 있을 수 있습니다. JavaScript의 Date 객체는 클라이언트 머신의 로컬 시간대를 기준으로 생성되기 때문에, 서버와 클라이언트 간의 시간대 차이로 인해 이러한 현상이 발생할 수 있습니다.

    가장 일반적인 상황은 서버와 클라이언트가 다른 시간대에 위치해 있을 때입니다. 예를 들어, 서버가 UTC(협정 세계 시)를 기준으로 시간을 표시하고, 클라이언트가 특정 지역의 로컬 시간대를 사용하고 있다면, 두 시간이 차이가 나게 됩니다.

    이러한 상황에서는 클라이언트나 서버에서 발생한 시간을 UTC로 변환하여 사용하거나, 서버에서 클라이언트에게 정확한 시간대 정보를 전달하여 이러한 문제를 방지할 수 있습니다. 예를 들어, JavaScript에서는 Date 객체의 toLocaleString 메서드를 사용하여 특정 시간대로 변환할 수 있습니다.

⇒ 간단하게 정리하자면

toISOString 메소드 → 항상 UTC( 협정 세계 시 ) 시간 기준

한국 시간 === 협정 세계 시간 + 9시간

협정 세계 시간에서 9시간 지난것이 한국 시간이라는 것이다.

있어 보이게 말한다면

ISOString은 우리나라 Time zone 이 아니라 UTC 타임 존(zero offset)을 사용해서 시간 차가 발생한 것이다.

한국 사이트에서는 사용이 부적합 하다

한국 시간대로 문자열 화 시키는 법

수정 
new Date().toISOString()
new Date().toLocaleString();

toLocaleString은 format했을 때 2024. 1.10 형식으로 뽑혀 별도의 함수를 작성해야 하는 번거로움이 있다.

dayjs(new Date()).format('YYYY-MM-DD');
moment(new Date()).format('YYYY-MM-DD').toString()

라이브러리 사용해서 원하는 형식으로 간단하게 format 가능

//1000(밀리초)*60(초)
const offset = new Date().getTimezoneOffset() * 60000;
const today = new Date(Date.now() - offset);
today.toISOString()

ISOString 꼭 사용해서 반환 시키고 싶다!

→ 대한민국의 offset을 수동으로 추가해준 뒤 ISOString 함수를 실행

getTimezoneOffset() 은 분 단위로 받기 때문에

new Date()함수에 넣기 위해서 밀리 초 단위로 가공 해준다.

결론

로컬과 클라이언트 간의 시간 차로 인해 발생된 이슈로

LocaleString 이나 ISOString 활용 할 수 야 있겠지만 라이브러리가 괜히 있는 것이 아니다

라이브러리 사용을 권장한다.


[참조]

https://velog.io/@minsu2344/JS-Date.toISOString의-잃어버린-9시간

https://velog.io/@zad1264/Date.toISOString-오프셋-맞추기

https://velog.io/@jisubin12/왜-데이트-피커에서는-하루-전으로-날짜가-찍히는가