Date 객체의 toISOString 메소드

자바스크립트에서 많이 사용하고 있는 Date 객체의 경우에는 toISOString 이라는 메소드를 지원한다.

평소에는 해당 메소드를 쓸일이 없지만 Date 함수를 통해 만들어진 Date 객체의 경우에는 yyyymmdd
형태가 아니기 때문에 간혹 보다보면 아래와 같은 코드로 사용하는 경우가 많다.

let currentDate = new Date();
let currentDay = currentDate.toISOString().substr( 0, 10 );
// currentDate == 'YYYY-MM-DD' 와 포맷으로 리턴

실제로 Date 객체를 계산하거나 전달할때 상당히 유용한 방법이라 대부분 많이 사용하고  있다.
(심지어 오픈소스에서도..) 다만 이 메소드가 생각보다 치명적인 오류가 될 수있다.

즉 사용할때 조심해야 할 부분이 있다.
우선 현재 날짜를 다음과 같이 2월 1일로 수정하자 시간은 오전 2~3시 정도로 잡으면 된다.

스크린샷 2017-02-01 오전 2.42.23

그 다음 브라우저 콘솔을 열어서 위 스크립트를 쳐보자

결과가 어떻게 나오는가?

예상했던 결과는 ‘2017-02-01′ 일 것이다.
( 2017은 연도에 따라 변경될 수 있겠지만 2월 1일이므로 2월1일로 예상했을 것이다. )

하지만 이 결과는 2017-01-31 로 나오게 된다. (?)

스크린샷 2017-02-01 오전 2.43.11

그래서 다시 currentDate 를 쳐보면
currentDate는 Wed Feb 01 2017 03:16:07 GMT+0900 (KST) 와 같이 정상적으로 2월 1일이 리턴되는데
정확한 날짜가 currentDate객체에 저장되었는데도 결과값이 다르게 나온다.

그렇다면 이 2개의 결과가 다른 이유는 무엇일까?

이 이유는 Date 객체의 toISOString 메소드는  ISO 포맷의 문자열로 반환하는데
이때 ISO 포맷은 타임존으로 UTC 타임존의 zero offset을  사용하게 되면서 발생하게 된다. 

즉 우리가 사용하는 타임존이 아닌 UTC 타임존으로 나오게 되고 날짜가 다르게 표현될 수도 있다.
우리 나라 시간은 해당 시간의 UTC+09:00 기준으로 나오기 때문에 9시간을 더해야 맞다.

조금 더 헷갈리면 아래의 코드를 쳐보면 알 수 있다.

currentDate.toUTCString();

스크린샷 2017-02-01 오전 2.43.17

역시 1월 31일로 나오게 된다.  여기에 9시간을 더하면 다음날 3시16분이 되므로 위에 currentDate 에 저장된 값과 일치 하게 된다.

오픈 소스들에서 문제가 안된이유는 아마도 오픈소스 소유자들의 국가들은 UTC 타임존이 zero offset이라 이슈가 되지 않아서 그럴 것 이고
결론적으로 toISOString() 은 UTC 타임존 zero offset을 사용하지 않는 국가에서 사용할때는 문제가 되므로 함부로 사용하면 안된다. 

 

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.

다음의 HTML 태그와 속성을 사용할 수 있습니다: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>