seungwoo.dev

자바스크립트에서 날짜가 9시간 밀려 보이는 이유 (UTC와 ISO 8601)

avatar image
Seungwoo Kim

6 min read

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)를 조금 더 명확히 이해하고 있었다면 훨씬 빨리 정리할 수 있었겠지만, 그래고 이번 경험을 통해 시간과 시간대에 대해 제대로 이해할 수 있었다.