- KST(한국 표준시)는 UTC+9, 즉 UTC보다 9시간 빠르다
- UTC는 “세계 표준시계”, GMT는 그 옛 이름이다 — 둘은 사실상 같지만 정의가 다르다
- 웹 시스템에서 시간 오류의 90%는 “타임존 변환 실수”에서 시작된다
왜 표준시 체계를 알아야 하는가
국내 웹사이트만 사용하는 학생에게도 표준시 체계는 의외로 자주 등장한다. 항공권·호텔 예약, 해외 콘서트 티켓팅, 깃허브 잔디, ISO 8601 포맷의 데이터 공유, 해외 친구와의 일정 조율 등에서 “지금 몇 시인가?”라는 질문은 항상 “어디 시각인가?”와 함께 다루어야 한다.
한국에서 09:00이 미국 동부에서는 19:00 전날, 영국에서는 00:00 같은 날 — 이 변환을 다룰 표준이 없으면 모든 글로벌 일정은 어그러진다. 그래서 인류는 두 개의 큰 표준을 만들었다. 하나는 GMT, 그것을 더 정밀화한 UTC, 그리고 그 위에 각 나라가 자기 시각을 정의하는 체계다.
GMT와 UTC — 닮았지만 다른 두 시계
GMT(Greenwich Mean Time)는 영국 그리니치 천문대의 평균 태양시였다. 19세기 후반, 영국이 세계 항해의 중심이었던 시대에 “전 세계 시계의 영점”으로 채택되었다. 그러나 태양의 운동을 기반으로 한 GMT는 정밀 측정 시대에 들어서면서 한계를 드러냈다. 지구의 자전 속도는 일정하지 않아 매일 미세하게 바뀐다.
그래서 1970년대에 새로운 표준이 등장했다 — UTC(Coordinated Universal Time, 협정 세계시). UTC는 다음 두 가지를 결합한다.
- TAI(국제 원자시): 전 세계 약 400대의 원자시계 평균으로 정의된 “수학적 시간”.
- 윤초(Leap Second): 지구 자전 변동을 보정하기 위해 가끔 추가되는 1초.
일상에서 GMT와 UTC는 동일하게 다뤄지지만, 엄밀하게는 정의가 다르다. 학술·항공·금융 등 정밀 영역에서는 항상 UTC를 쓴다. 윤초의 동작 방식은 윤초와 서머타임이 시스템에 미치는 영향에서 더 자세히 다룬다.
한국 표준시(KST)는 UTC+9다
한국 표준시(Korea Standard Time, KST)는 UTC보다 9시간 빠르다. 즉 UTC가 00:00일 때 KST는 09:00이다. 표기는 보통 다음과 같다.
2026-04-28T09:00:00+09:00— ISO 8601 형식2026-04-28T00:00:00Z— UTC 기준, “Z”는 “Zulu time = UTC”의 약자- 위 두 표기는 정확히 같은 시점을 가리킨다.
한국이 “UTC+9”인 역사적 배경
한국은 일제강점기 이후 일본과 같은 UTC+9를 사용했다. 1954년 이승만 정권이 한반도 지리에 더 맞는 UTC+8:30(반시간 빠른 시간)을 도입했지만, 1961년 박정희 정권에서 다시 UTC+9로 환원되어 오늘에 이른다. 북한은 2015년에 UTC+8:30을 도입했다가 2018년 다시 UTC+9로 통일했다.
일광절약시간(DST)과 한국
여름 동안 시계를 1시간 앞당기는 일광절약시간(Daylight Saving Time, DST)은 미국·유럽·호주·뉴질랜드 등에서 사용된다. 한국은 1949~1960년, 1987~1988년에 일시적으로 시행했지만 현재는 시행하지 않는다.
해외와 일정을 잡을 때 가장 자주 발생하는 실수가 DST 적용 여부를 잊는 것이다. 미국 동부는 EST(UTC−5)와 EDT(UTC−4)를 봄·가을마다 전환한다. 즉, “한국 09:00 = 뉴욕 19:00 전날”이라는 등식은 일년 내내 성립하지 않는다 — DST 기간에는 한 시간이 달라진다.
웹 개발에서 시간 오류의 90%는 타임존 변환 실수
웹 시스템에서 자주 보는 시간 관련 버그는 거의 모두 다음 패턴이다.
- DB에 KST로 저장하고 다른 서버에서 UTC로 읽음
- UTC로 저장했지만 출력할 때 타임존을 빼먹음
- 두 서버의 OS 타임존 설정이 다름
- JavaScript의
new Date()가 사용자 OS의 타임존을 따른다는 것을 잊음
가장 깨끗한 패턴은 “DB·서버·통신은 항상 UTC로, 사용자에게 보여줄 때만 로컬 타임존으로 변환”이다. 이 원칙을 “Internally UTC, externally local”이라고 부른다.
// PHP 권장 패턴
date_default_timezone_set('UTC'); // 서버는 UTC
$createdAt = new DateTime('now'); // UTC로 저장
$display = $createdAt->setTimezone(
new DateTimeZone('Asia/Seoul')
)->format('Y-m-d H:i:s'); // 표시할 때 KST
ISO 8601과 RFC 3339 — “표기”의 표준
시간 “표기”에도 표준이 있다. 가장 널리 쓰이는 두 가지다.
- ISO 8601:
YYYY-MM-DDTHH:MM:SS±HH:MM형태. 예:2026-04-28T09:00:00+09:00 - RFC 3339: ISO 8601의 부분집합. 인터넷 프로토콜에서 표준으로 채택됨.
이 표기 덕분에 다른 언어·시스템 간에 시간을 주고받을 때 모호함이 사라진다. 2026-04-28 09:00이라는 표기만으로는 “이게 KST야 UTC야?”를 구별할 수 없지만, 2026-04-28T09:00+09:00은 명확하다.
유닉스 타임스탬프 — “타임존이 없는 시간”
유닉스 타임스탬프는 1970-01-01 00:00:00 UTC부터의 누적 초 수다. 즉, “어떤 타임존을 사용하든 같은 값”인 절대 시간이다. 이 단순성 덕분에 웹·모바일·DB 등 거의 모든 시스템 내부에서는 유닉스 타임스탬프(또는 ms 단위 변형)로 시간을 다룬다.
- 한국 시각 2026-04-28 09:00:00 KST = 1772499600 (초)
- UTC 2026-04-28 00:00:00 UTC = 1772499600 (초)
- 두 표기는 같은 유닉스 타임스탬프 — 즉, 같은 시점이다.
JavaScript의 Date.now()는 ms 단위 유닉스 타임스탬프를 반환한다. 이 값을 두 시스템이 주고받으면 타임존 혼란이 발생할 여지가 없다.
- 해외 일정은 항상 “현지 시각 + UTC 환산”을 함께 적는다.
- DB에 시간을 저장할 때는 UTC, 또는 timestamp(int) 사용.
- JavaScript에서 시간을 비교할 때는
Date.now()(ms)로 비교. - 해외 콘서트 티켓팅 일정은 DST 적용 여부를 반드시 확인.
- 로그·분석 데이터는 기록 시점의 UTC를 함께 남긴다.
다음 글에서는 윤초와 서머타임이 시스템에 미치는 영향을 다룬다.