자바스크립트에서 날짜가 9시간 밀려 보이는 이유 (UTC와 ISO 8601)
UTC, ISO 8601, GMT를 이해하며 정리한 시간 문제
프로젝트를 진행하던 중 수정 이력 날짜가 하루 밀려 보이는 문제가 있었다.
서버에서 내려온 값은 다음과 같았다.
'2025-12-17T16:15:55.000Z''2025-12-17T16:15:55.000Z'이를 화면에 출력했더니,
'2025-12-18 01:15:55''2025-12-18 01:15:55'다음 날 새벽 1시로 표시되었다.
정확히 9시간이 더해진 값이었다.
처음에는 자바스크립트가 시간을 잘못 계산한 것이 아닐까 생각했다.
하지만 원인은 계산이 아니라 시간의 기준에 대한 이해 부족이었다.
1. 왜 9시간이 더해졌을까?
문자열 끝의 Z는 UTC 기준 시간임을 의미한다.
'2025-12-17T16:15:55.000Z''2025-12-17T16:15:55.000Z'이 값은
2025년 12월 17일 16시 15분 55초 (UTC 기준)
이라는 뜻이다.
자바스크립트는 이 값을 현재 환경의 시간대로 변환해 보여준다.
한국 시간(KST)은 UTC보다 9시간 빠르다.
KST = UTC + 9시간KST = UTC + 9시간따라서 UTC 16:15는 한국 시간으로 변환하면
다음 날 01:15가 된다.
자바스크립트가 9시간을 더한 것이 아니라,
UTC 시간을 로컬 시간대로 변환해 보여준 것이다.
2. UTC란 무엇일까?
UTC(Coordinated Universal Time)는
전 세계가 공통으로 사용하는 기준 시간이다.
쉽게 말하면 "세계 공통 시간"이다.
각 나라의 시간은 이 UTC를 기준으로 계산된다.
예를 들어, 한국 시간(KST)은 UTC보다 9시간 빠르다.
3. 자바스크립트 Date의 동작
자바스크립트의 Date 객체는
- 내부적으로 UTC 기준 시간을 저장하고
- 출력할 때 현재 환경의 시간대에 맞게 변환한다.
예를 들어:
const date = new Date('2025-12-17T16:15:55.000Z')
console.log(date.toISOString()) // 2025-12-17T16:15:55.000Z => UTC 기준 출력
console.log(date.toString()) // Thu Dec 18 2025 01:15:55 GMT+0900 (대한민국 표준시) => 로컬 시간 기준 출력const date = new Date('2025-12-17T16:15:55.000Z')
console.log(date.toISOString()) // 2025-12-17T16:15:55.000Z => UTC 기준 출력
console.log(date.toString()) // Thu Dec 18 2025 01:15:55 GMT+0900 (대한민국 표준시) => 로컬 시간 기준 출력같은 Date 객체라도 출력 방식에 따라 다르게 보인다.
시간이 변경된 것이 아니라, 표시 기준이 달라진 것이다.
4. ISO 8601 형식
'2025-12-17T16:15:55.000Z''2025-12-17T16:15:55.000Z'이건 ISO 8601이라는 날짜/시간 표준 형식이다.
이름은 조금 어렵지만,
전 세계에서 약속한 날짜 표현 방식이라고 이해하면 충분하다.
여기서 중요한 부분은 마지막이다.
Z: UTC 시간+09:00: UTC보다 9시간 빠른 시간대 (서울, 도쿄)-05:00: UTC보다 5시간 느린 시간대 (뉴욕)
예를 들어,
'2025-12-17T17:15:55.000+09:00''2025-12-17T17:15:55.000+09:00'이 문자열은 이미 한국 시간임을 말하고 있다.
5. UTC와 GMT
콘솔에서 다음과 같이 출력해보면:
console.log(new Date().toUTCString())console.log(new Date().toUTCString())결과는 GMT로 표시된다.
'Wed, 26 Feb 2026 02:00:00 GMT''Wed, 26 Feb 2026 02:00:00 GMT'GMT(Greenwich Mean Time)는 과거에 사용되던 세계 기준 시간이다.
현재는 UTC가 공식 기준이지만, 개발 관점에서는 UTC와 GMT를 같은 기준 시간으로 이해해도 무방하다.
실제로 다음 두 메서드는 동일한 결과를 출력한다.
console.log(new Date().toUTCString()) // 'Wed, 17 Dec 2025 16:15:55 GMT'
console.log(new Date().toGMTString()) // 'Wed, 17 Dec 2025 16:15:55 GMT'console.log(new Date().toUTCString()) // 'Wed, 17 Dec 2025 16:15:55 GMT'
console.log(new Date().toGMTString()) // 'Wed, 17 Dec 2025 16:15:55 GMT'6. 실제 문제의 원인
백엔드에서는 한국 시간 기준으로 생각하고 데이터를 내려줬지만,
문자열은 UTC 기준(Z)으로 전달되었다.
프론트에서는 이를 UTC로 해석하고 로컬 시간으로 변환했다.
그 결과 9시간이 더해진 값이 표시되었다.
문제는 로직이 아니라 시간의 기준에 대한 합의였다.
7. 해결 방법
해결을 위해 시간 기준을 명확히 정의했다.
- UTC 기준으로 전달할 것인지
- 한국 시간(
+09:00)으로 전달할 것인지
최종적으로 서버에서는 다음과 같은 형식으로 데이터를 전달하기로 했다.
'2025-12-17T17:15:55.000+09:00''2025-12-17T17:15:55.000+09:00'이제 문자열 자체에 시간대 정보가 명시되어 있으므로
프론트에서 추가 변환을 할 필요가 없다.
정리
결국 해결 방법은 단순했다.
서버에서
- 끝의
Z를 제거하고+09:00을 명시해 주거나2025-12-17T16:15:55.000+09:00
- 원래 시간에서 9시간을 빼서 UTC로 전달하거나
2025-12-17T07:15:55.000Z
시간의 기준만 맞추면 되는 문제였다.
내가 시간의 기준(UTC)과 시간대(offset)를 조금 더 명확히 이해하고 있었다면 훨씬 빨리 정리할 수 있었겠지만, 그래고 이번 경험을 통해 시간과 시간대에 대해 제대로 이해할 수 있었다.