UTC
고친 사람 github-actions[bot]
UTC 는 온 세상이 지금 몇 시인지를 하나로 맞춰 주는 기준 시각입니다. 나라마다 쓰는 시각은 이 기준에 몇 시간을 더하거나 빼서 얻습니다. 서버와 데이터베이스는 시각을 저장할 때 흔히 이 기준으로 적습니다.
쉽고 빠른 이해
UTC 는 나라와 상관없이 하나로 정해 둔 세계 공용 시각입니다. 서울이 오후 2시 30분이면 UTC 는 오전 5시 30분입니다.
기준 시각이 없으면 서버마다 자기 지역 시각으로 로그를 찍게 됩니다. 그러면 두 서버의 기록 중 무엇이 먼저인지 가리려고 매번 지역 차이를 따져야 합니다. 서머타임을 쓰는 지역에서는 같은 시각이 한 해에 두 번 오기도 합니다.
그래서 로그나 결제처럼 이미 일어난 기록은 UTC 로 저장합니다. 앞으로 열릴 지역 약속만 예외로 지역 시각을 적습니다.
- 세계 곳곳의 원자시계가 1초씩 셉니다
- 그 셈을 모아 세계에 하나뿐인 시각을 만듭니다
- 지구 자전으로 잰 시각과 1초 가까이 벌어지면 1초를 끼워 넣어 맞춥니다
- 각 지역은 이 시각에 몇 시간을 더하거나 빼서 씁니다
대가는 끼워 넣는 1초입니다. 그날은 1분이 61초가 됩니다. 1분을 늘 60초로 믿던 소프트웨어가 이 1초에서 걸려 넘어집니다.
상세
이 절은 UTC(Coordinated Universal Time, 협정 세계시)가 무엇으로 만들어진 시각인지부터 봅니다. 원자시계가 세는 초, 지구 자전에 맞추려고 끼우는 윤초, 이 일을 나눠 맡은 기관, 지역 시각을 얻는 셈을 차례로 짚습니다. 마지막으로 이름이 비슷한 이웃과 가르고, 백엔드가 UTC 를 저장과 표시에 어떻게 나눠 쓰는지 봅니다.
UTC 는 전 세계가 함께 쓰는 기준 시각입니다. 「지금 몇 시인가」라는 물음에 나라와 상관없이 답 하나를 줍니다. 서울에서 읽어도 런던에서 읽어도 UTC 로는 같은 오전 5시 30분입니다.
이 기준이 있어서 서로 다른 나라의 기록을 한 줄에 세울 수 있습니다. 서울 서버의 로그와 미국 서버의 로그가 둘 다 UTC 로 찍혀 있으면 값만 견줘도 앞뒤가 나옵니다. 지역 시각으로 찍혀 있으면 지역마다의 차이를 먼저 되돌려야 합니다.
원자시계가 세는 초
UTC 의 1초는 원자시계가 정합니다. 특정 원자가 내놓는 전자기파는 떨리는 빠르기가 언제나 같습니다. 그 떨림을 정해진 횟수만큼 센 길이를 1초로 삼습니다. 그래서 날씨나 계절과 상관없이 1초의 길이가 흔들리지 않습니다.
세계 여러 연구소가 원자시계를 돌립니다. 그 값을 모아 평균 낸 시각이 TAI(International Atomic Time, 국제원자시)입니다. TAI 는 끊기지 않고 1초씩 늘기만 합니다. 되돌아가거나 1초를 건너뛰는 일이 없습니다.
UTC 는 TAI 와 같은 박자로 갑니다. 다른 점은 둘 사이에 정수 초만큼 차이가 난다는 것 하나입니다. TAI 가 1초 늘 때 UTC 도 1초 늡니다. 대신 UTC 는 TAI 보다 몇 초 뒤에 서 있습니다. 그 몇 초는 아래에서 볼 윤초가 쌓인 만큼입니다.
지구 자전에 붙잡아 두는 윤초
사람이 쓰는 하루는 원자가 아니라 지구가 정합니다. 해가 떴다 지는 것은 지구가 한 바퀴 도는 일이기 때문입니다. 그런데 지구가 도는 속도는 일정하지 않고 조금씩 흔들립니다.
지구 자전으로 잰 시각을 UT1(Universal Time 1, 세계시 1)이라고 부릅니다. 원자시계만 따르면 UT1 과 조금씩 벌어집니다. 오래 놔두면 시계가 정오를 가리킬 때 해가 한가운데에 있지 않게 됩니다.
UTC 는 둘을 절충합니다. 박자는 원자시계를 따릅니다. 가리키는 값은 UT1 에서 멀어지지 않게 붙잡습니다. 붙잡는 폭은 0.9초입니다. UT1 과 0.9초 넘게 벌어지지 않도록 1초를 넣거나 뺍니다. 이 1초가 윤초입니다.
윤초는 어느 달의 마지막 초로 둡니다. 6월 말과 12월 말을 먼저 고릅니다. 그다음이 3월 말과 9월 말입니다. 1초를 넣는 날에는 초 칸이 59 다음에 60 이라는 번호를 하나 더 받습니다. 6월 30일 밤에 1초를 넣으면 UTC 시각은 이렇게 흐릅니다.
23:59:59 // 6월 30일, 평소의 마지막 초
23:59:60 // 끼워 넣은 윤초
00:00:00 // 7월 1일 첫 초
그 1분은 61초입니다. 반대로 1초를 빼는 날에는 23시 59분 58초 다음이 곧바로 다음 달 0시 0분 0초입니다.
윤초를 다루는 두 방법
많은 소프트웨어는 1분이 늘 60초라고 믿습니다. 어느 기준 순간부터 흐른 초의 수 하나로 시각을 적는 유닉스 시간도 하루를 늘 86400초로 셉니다. 그래서 23시 59분 60초에 붙일 번호가 따로 없습니다.
이 1초를 다루는 길은 둘입니다. 첫째는 23시 59분 59초라는 번호를 두 번 쓰는 것입니다. 컴퓨터가 「지금 몇 시」로 읽어 주는 값을 벽시계라고 합니다. 이 방법에서는 벽시계 값이 59초 끝에서 59초 처음으로 1초 뒤로 돌아갑니다.
둘째는 윤초 문지르기(leap smear)입니다. 윤초 앞뒤 몇 시간 동안 1초를 잘게 나눕니다. 그 조각만큼 박자를 조금씩 늦춰 1초를 흡수합니다. 벽시계 값은 뒤로 돌아가지 않습니다.
UTC 를 정하고 굴리는 기관
UTC 는 한 기관이 혼자 만드는 시각이 아닙니다. 계산하는 곳, 윤초를 정하는 곳, 규칙을 문서로 적는 곳이 나뉩니다.
| 기관 | 하는 일 |
|---|---|
| BIPM(Bureau International des Poids et Mesures, 국제도량형국) | 세계의 원자시계 값을 모아 TAI 와 UTC 를 계산합니다 |
| IERS(International Earth Rotation and Reference Systems Service, 국제 지구자전·기준계 사업) | 지구 자전을 지켜보다가 윤초를 넣을지 정합니다. 넣기로 하면 적어도 여덟 주 전에 알립니다 |
| ITU-R(International Telecommunication Union Radiocommunication Sector, 국제전기통신연합 무선통신부문) | 시보(시각을 알리는 방송 신호)와 표준 주파수를 UTC 에 맞추라는 권고를 냅니다. 0.9초 폭과 윤초를 두는 달도 이 권고가 정합니다 |
그 권고의 이름이 TF.460-6(Time signals and Frequency standards emissions 계열 460번 권고의 6판)입니다. UTC 가 표준으로 서는 근거가 이 문서입니다.
지역 시각은 UTC 에 오프셋을 더한 값
나라마다 쓰는 시각은 UTC 에서 정해진 시간만큼 앞서거나 뒤집니다. 이 차이를 UTC 오프셋이라고 부릅니다. 서울은 UTC 보다 9시간 앞서므로 오프셋이 +09:00 입니다.
서머타임은 여름철에 시계를 한 시간 앞당겨 쓰는 제도입니다. 서머타임을 쓰는 지역은 철마다 오프셋이 바뀝니다. 런던은 겨울에 +00:00, 여름에 +01:00 입니다. UTC 자신은 서머타임이 없어서 오프셋이 늘 0입니다.
그래서 서머타임을 쓰는 지역은 오프셋 숫자 하나로 적을 수 없습니다. 어느 지역이 언제 어떤 오프셋을 쓰는지 정한 규칙 묶음을 시간대라고 부릅니다. 시간대에는 Asia/Seoul, Europe/London 같은 이름이 붙습니다. 오프셋은 한 순간의 차이를 적은 숫자입니다. 시간대 이름은 그 지역의 규칙 전체를 가리킵니다.
flowchart TD
A["원자시계 여럿"] --> T["TAI · 끊김 없이 1초씩 는다"]
T --> U["UTC · TAI 와 정수 초 차이"]
E["지구 자전 · UT1"] -.->|"0.9초 안으로 붙잡는다 · 윤초"| U
U --> S["서울 시각 · +09:00"]
U --> L["런던 시각 · 겨울 +00:00 · 여름 +01:00"]
위에서 아래로 내려오며 시각 하나가 만들어집니다. UTC 는 원자시계의 박자를 받습니다. 옆에서 들어오는 지구 자전이 값을 붙잡습니다. 지역 시각은 맨 아래에서 오프셋만 더해 갈라집니다.
같은 순간을 UTC 와 서울 시각으로 적으면 이렇습니다. 끝의 Z 는 오프셋이 0 이라는 표시입니다. 곧 UTC 라는 뜻입니다. 이 표기법은 ISO 8601(International Organization for Standardization 8601, 국제표준화기구의 날짜·시각 표기 표준)이 정합니다.
2026-09-24T05:30:00Z // UTC
2026-09-24T14:30:00+09:00 // 서울 시각
두 줄은 글자가 달라도 같은 순간을 가리킵니다. 아래 줄에서 9시간을 빼면 위 줄이 나옵니다.
UTC 와 헷갈리는 GMT
UTC 와 자주 섞어 부르는 이름이 GMT(Greenwich Mean Time, 그리니치 평균시)입니다. GMT 는 영국 그리니치에서 본 태양의 움직임에 맞춘 시각입니다. 곧 지구 자전이 기준입니다. 이 점에서 GMT 는 앞에서 본 UT1 과 같은 뿌리입니다. 오늘날 천문학은 지구 자전으로 잰 시각을 GMT 대신 UT1 이라는 이름으로 더 정밀하게 잽니다.
일상에서는 둘이 1초도 안 되게 차이 나서 같은 것처럼 씁니다. 하지만 박자를 정하는 쪽이 다릅니다. UTC 는 원자시계가, GMT 는 지구 자전이 정합니다. 초 단위까지 따지는 시스템에서 기준으로 삼는 쪽은 UTC 입니다.
백엔드가 UTC 를 쓰는 방식
백엔드에서 흔한 규칙은 「저장은 UTC 로, 보여 줄 때만 지역 시각으로」입니다. 저장한 값끼리는 오프셋을 따질 필요 없이 바로 견주고 정렬할 수 있습니다. 서버를 다른 나라로 옮겨도 저장한 값의 뜻이 안 바뀝니다.
서머타임이 만드는 구멍도 피합니다. 서머타임이 시작하는 날에는 지역 시각 한 시간이 통째로 사라집니다. 끝나는 날에는 같은 한 시간이 두 번 옵니다. UTC 에는 이런 구멍이 없습니다. 「새벽 1시 30분」이 두 순간을 가리키는 일도 없습니다.
예외가 하나 있습니다. 앞으로 열릴 약속처럼 그 지역의 규칙을 따라가야 하는 시각입니다. 지역 규칙은 바뀌기도 합니다. 나라가 오프셋을 새로 정하거나 서머타임을 새로 두거나 없애는 일이 그렇습니다.
「내년 여름 뉴욕 오전 9시 회의」를 지금 UTC 로 바꿔 저장했다고 합시다. 그 사이 그 나라가 서머타임을 없애면 저장한 UTC 는 뉴욕 시각으로 오전 8시를 가리킵니다. 그래서 이런 값은 지역 시각과 시간대 이름(America/New_York)을 같이 저장합니다. 시간대 이름이 있으면 약속 날의 규칙으로 다시 셈할 수 있습니다.
| 하려는 일 | 저장하는 값 |
|---|---|
| 로그 한 줄에 시각을 찍는다 | UTC |
| 결제가 일어난 순간을 남긴다 | UTC |
| 토큰의 만료 시각을 적는다 | UTC |
| 앞으로 열릴 회의 시각을 잡는다 | 지역 시각 + 시간대 이름 |
위 셋은 이미 지나갔거나 기계가 견주는 순간입니다. 마지막 줄만 사람이 사는 지역의 달력을 따라가야 해서 갈립니다.
관련 항목
UTC 가 박자와 값을 받아 오는 시간 척도
TAI · 국제원자시 · UT1 · 세계시 · GMT · 원자시계 · 초
UTC 를 계산하고 규칙을 적는 기관과 권고
BIPM · IERS · ITU-R · 국제도량형총회 · TF.460-6 · 표준
UTC 를 지구 자전에 맞추는 보정
윤초 · 윤초 문지르기 · DUT1 · leap-seconds.list
UTC 를 기준으로 시각을 적는 표기와 값
ISO 8601 · RFC 3339 · 유닉스 시간 · 에포크 · 타임스탬프
UTC 에서 지역 시각을 얻는 규칙
UTC 오프셋 · 시간대 · 서머타임 · 시간대 데이터베이스 · 한국 표준시
UTC 를 기기에 나르고 따라가는 시계와 프로토콜
다른 이름: Coordinated Universal Time · 협정 세계시 · 세계 협정시 · UTC 시각