사전 타임스케일
개념

타임스케일

gabury1고친 사람 github-actions[bot]

타임스케일은 흘러가는 시간의 순간마다 번호를 붙여 줍니다. 그 번호가 있어야 서로 다른 기록에 남은 사건의 앞뒤를 견줄 수 있습니다. 번호를 붙이는 규칙은 여럿이라 한 순간도 규칙마다 다른 번호를 받습니다. 그래프 축의 시간 눈금을 부르는 말과는 다른 뜻입니다.

쉽고 빠른 이해

타임스케일은 「지금이 몇 번째 초인가」를 세는 규칙입니다. 2017년의 첫 순간을 사람이 쓰는 시각으로 읽으면 0시 0분 0초입니다. 원자시계만 따르는 시각으로 읽으면 0시 0분 37초입니다.

어느 규칙으로 센 값인지 확인하지 않고 기록을 섞으면 시각이 수십 초 가까이 어긋날 수 있습니다. 그러면 먼저 일어난 일이 나중에 일어난 것처럼 보입니다.

규칙 하나는 세 가지를 정합니다.

  1. 1초의 길이를 무엇으로 재나 — 원자시계인가, 지구가 도는 속도인가
  2. 어느 순간을 0으로 삼나
  3. 지구 자전과 벌어질 때 1초를 끼워 맞추나

1초를 끼우는 규칙은 해의 움직임과 맞는 대신 1분이 61초인 날이 생깁니다. 끼우지 않는 규칙은 끊김이 없는 대신 해의 움직임과 점점 벌어집니다.

상세

건물 층수를 세는 방식을 떠올려 봅시다. 한국에서는 땅과 맞닿은 층을 1층이라고 부릅니다. 유럽의 많은 건물은 같은 층을 0층이라고 부릅니다. 두 사람이 같은 층에 서 있어도 「몇 층이냐」는 물음에 다른 답을 냅니다.

타임스케일(time scale)은 순간마다 번호를 매기는 규칙입니다. 이 번호로 사건들의 앞뒤를 헷갈림 없이 줄 세웁니다. 「2017년 1월 1일 0시 0분 0초」라는 값도 어느 타임스케일로 센 것인지 알아야 한 순간을 가리킵니다.

타임스케일의 번호는 늘 앞으로만 가는 계수기처럼 늘어납니다. 이 계수기의 값을 날짜와 시각으로 풀어 적은 것이 우리가 보는 시각입니다. 번호가 어느 순간 한 번에 건너뛰거나 되돌아가면 그것을 끊김이라고 부릅니다.

타임스케일 하나를 세우는 세 가지

타임스케일을 하나 세우려면 세 가지를 정해야 합니다. 아래 표는 그 셋과, 셋 각각이 타임스케일마다 어떻게 갈리는지를 보입니다.

정하는 것 묻는 것 갈리는 예
1초의 길이 번호 하나가 늘어나는 간격을 무엇으로 재나 원자시계 · 지구가 도는 속도
기점 어느 순간을 0으로 삼나 1900년 1월 1일 · 1970년 1월 1일 · 1980년 1월 6일
보정 규칙 지구 자전과 벌어지면 끊김을 두나 1초를 끼운다 · 끼우지 않는다

원자시계는 원자가 내는 전자기파의 떨림 횟수를 세어 1초를 잽니다. 이 떨림은 빠르기가 고릅니다. 지구가 도는 속도는 고르지 않아서, 그것으로 잰 1초는 간격이 흔들립니다.

기점은 번호가 0인 순간입니다. 표의 세 날짜는 뒤의 예시 절에 나오는 타임스케일 셋이 각각 0으로 삼는 날입니다.

보정 규칙에서 끼우는 1초를 윤초라고 부릅니다. 1분을 61초로 늘리면 양의 윤초, 59초로 줄이면 음의 윤초입니다. 윤초는 번호에 끊김을 만듭니다.

타임스케일 차이

두 타임스케일이 한 순간에 읽는 값의 차를 타임스케일 차이라고 부릅니다. 타임스케일 A 와 B 의 차이는 A − B 로 적습니다.

사람이 쓰는 시각의 바탕은 UTC(Coordinated Universal Time, 협정 세계시)입니다. 원자시계만 따르는 타임스케일은 TAI(International Atomic Time, 국제원자시)입니다. 2017년 1월 1일 0시 0분 0초 UTC 에 TAI 는 0시 0분 37초를 가리킵니다. 이때 TAI − UTC 는 37초입니다.

두 타임스케일은 박자가 같습니다. 차이가 벌어진 까닭은 UTC 에만 윤초가 들어가기 때문입니다. 왜 그렇게 만들었는지는 배경 절이 다룹니다.

같은 이름의 다른 뜻

「타임스케일」은 그래프의 가로축 눈금이나, 어떤 현상이 벌어지는 시간의 규모를 부를 때도 씁니다. 「밀리초 타임스케일의 지연」 같은 말이 그렇습니다. 이 뜻은 순간에 번호를 매기는 규칙과 상관이 없습니다.

배경

1972년까지 기준 시각은 지구 자전으로 잰 UT1(Universal Time 1, 세계시 1)이었습니다. UT1 은 지구가 자전축을 중심으로 돈 각도에 바로 대응하는 시각입니다. 그런데 지구의 자전 속도는 불규칙하게 흔들립니다. 달과 해가 끄는 힘, 대기와 바다의 움직임이 자전을 흔듭니다. 이 흔들림이 차츰 드러나면서 자전으로 잰 1초는 간격이 고른 기준이 되지 못했습니다.

1초의 길이는 원자로 다시 정했습니다. 1967년 국제도량형총회(CGPM, General Conference on Weights and Measures)는 1초를 세슘-133 원자가 내는 복사의 9 192 631 770 주기로 정했습니다. 원자로 센 TAI 는 고르게 흐르지만 지구 자전과는 서서히 벌어집니다. 그래서 1972년에 기준 시각을 UTC 로 바꿨습니다. UTC 는 박자를 TAI 와 같게 두고, UT1 과의 차이가 0.9초를 넘기 전에 윤초를 끼웁니다.

이 절충은 끊김이라는 값을 치렀습니다. 2022년 국제도량형총회는 윤초가 만드는 끊김이 위성 항법·통신·전력 전송 같은 핵심 디지털 기반 시설에 심각한 오작동을 일으킬 위험이 있다고 보았습니다. 그리고 UT1 − UTC 의 최대 허용값을 2035년까지, 또는 그 전에 늘리기로 결정했습니다. 새 최대값을 정하는 일은 2026년 제28차 총회에서 합의할 결의안으로 넘어가 있습니다.

예시

이 절은 백엔드 개발자가 만나는 다섯 군데 실물에서 타임스케일이 어떻게 드러나는지 봅니다. 대상은 리눅스 시계, 인터넷 타임스탬프 문자열, 시각 동기화 패킷, 윤초 목록 파일, 위성 항법 수신기입니다. 각 소절은 그 실물이 어느 타임스케일로 세는지와, 다른 타임스케일과 섞일 때 무엇이 어긋나는지를 봅니다.

리눅스의 CLOCK_REALTIME 과 CLOCK_TAI

유닉스 시간은 1970년 1월 1일 0시 0분 0초 UTC 를 기점으로 센 초입니다. 이 기점을 에포크라고 부릅니다. POSIX(Portable Operating System Interface, 이식 가능 운영체제 인터페이스) 규격의 유닉스 시간은 하루를 언제나 86400초로 칩니다. 그래서 윤초 1초에는 붙일 번호가 없습니다.

리눅스의 clock_gettime() 호출로 읽는 CLOCK_REALTIME 은 보통 이 유닉스 시간을 셉니다. 윤초는 세지 않습니다. 윤초 근처에서는 대개 NTP(Network Time Protocol, 네트워크 시간 프로토콜)가 이 시계를 UTC 에 맞춥니다. 같은 기계의 CLOCK_TAI 는 윤초까지 세는 시계입니다. 기점이 1970년 1월 1일 0시 TAI 라서 CLOCK_REALTIME 보다 기점이 10초 이릅니다.

마지막 윤초가 들어간 2016년 12월 31일 끝을 두 시계로 읽으면 이렇습니다.

UTC CLOCK_REALTIME CLOCK_TAI
2016-12-31 23:59:59 1483228799 1483228835
2016-12-31 23:59:60 따로 번호가 없다 1483228836
2017-01-01 00:00:00 1483228800 1483228837

CLOCK_TAI 는 1초씩 쉼 없이 늡니다. CLOCK_REALTIME 은 첫 줄과 셋째 줄의 차가 1초인데, 그 사이에 흐른 시간은 2초입니다. 유닉스 시간 두 개를 빼서 흐른 시간을 재는 코드는 윤초를 낀 구간에서 1초 적게 셉니다.

지금 CLOCK_TAI 는 CLOCK_REALTIME 보다 37초 큽니다. 윤초 폐지가 계획돼 있어 이 차이는 앞으로 오랫동안 37초로 남을 가능성이 큽니다. 다만 CLOCK_TAI 는 NTP 의 도움이 있어야 제 값을 갖고, 도움이 없으면 CLOCK_REALTIME 처럼 움직입니다.

윤초 1초 동안 유닉스 시간이 어떻게 움직일지는 합의된 방법이 없습니다. 시계가 멈추기도 하고, 1초 되돌아가기도 하고, 아주 느리게 가거나 윤초 근처에서 조금 느려지기도 합니다.

RFC 3339 타임스탬프의 23:59:60

RFC 3339(Request for Comments 3339)는 인터넷에서 날짜와 시각을 문자열로 적는 형식입니다. 이 형식의 초 칸은 윤초 규칙에 따라 00부터 60까지 받습니다. 1990년 말에 들어간 윤초는 이렇게 적습니다.

1990-12-31T23:59:60Z
1990-12-31T15:59:60-08:00

첫 줄 끝의 Z 는 UTC 로 적었다는 표시입니다. 둘째 줄 끝의 -08:00 은 지역 시각이 UTC 보다 8시간 늦다는 표시이고, 이 차이를 UTC 오프셋이라고 부릅니다. 둘째 줄은 같은 윤초를 태평양 표준시로 적은 것입니다. 윤초는 전 세계에서 한 순간에 들어가므로 이 지역에서는 오후 3시 59분 60초가 됩니다.

초 칸을 59까지만 받게 짠 파서는 이 문자열을 읽지 못합니다. 윤초가 없는 날에는 드러나지 않다가 윤초가 든 값을 받는 날 오류가 납니다.

NTP 패킷의 윤초 예고

NTP 는 네트워크로 기기의 시계를 UTC 에 맞추는 프로토콜입니다. NTP 의 타임스케일은 1900년 1월 1일 0시 UTC 를 기점으로 삼습니다. 패킷 머리에는 2비트짜리 LI(Leap Indicator, 윤초 예고) 칸이 있어서 이번 달에 들어갈 윤초를 미리 알립니다.

LI 값 뜻
0 예고 없음
1 그날 마지막 1분이 61초
2 그날 마지막 1분이 59초
3 알 수 없음 · 시계가 동기화되지 않음

1분이 61초가 되는 순간을 제대로 못 다루는 응용과 운영체제가 있다고 알려져 있습니다. 그래서 일부 NTP 설치는 윤초 문지르기(leap smearing)를 씁니다. 1초를 한 번에 넣지 않고, 윤초 앞뒤의 긴 시간에 걸쳐 시계를 조금씩 나눠 맞춥니다.

대가로 그 구간 동안 시계가 구현에 따라 UTC 에서 최대 1초까지 벗어날 수 있습니다. 문지르는 서버와 문지르지 않는 서버는 그 구간에 서로 다른 시각을 냅니다. 그래서 누구나 쓰는 공개 NTP 서버는 문지르기를 쓰면 안 됩니다(MUST NOT).

leap-seconds.list 의 TAI − UTC 줄

IANA(Internet Assigned Numbers Authority, 인터넷 할당 번호 관리 기관) 시간대 데이터베이스는 leap-seconds.list 라는 윤초 목록 파일을 함께 냅니다. 한 줄이 윤초 하나입니다. 첫 칸은 그 날짜의 NTP 타임스탬프, 곧 1900년부터 센 초입니다. 둘째 칸은 그날부터의 TAI − UTC 입니다.

2272060800      10      # 1 Jan 1972
2287785600      11      # 1 Jul 1972
2524521600      19      # 1 Jan 1980
3692217600      37      # 1 Jan 2017

윤초 제도가 시작된 1972년 1월 1일에 TAI − UTC 는 이미 10초였습니다. 그 뒤 윤초가 한 번 들어갈 때마다 1씩 늘어, 27번째 윤초를 지난 2017년 1월 1일에 37이 됐습니다. 그 뒤로 새 윤초는 없고, 2026년 12월 말에도 넣지 않는다는 공고가 나왔습니다.

GPS 수신기의 UTC 계산

GPS(Global Positioning System, 위성 항법 시스템) 시간은 1980년 1월 6일 0시 UTC 에 맞춰 출발한 타임스케일입니다. 끊김 없는 연속 타임스케일이라 윤초를 받지 않습니다. 그래서 수신기가 UTC 를 얻으려면 위성이 함께 보내는 윤초 차이를 빼야 합니다.

tUTC = (tE - ΔtUTC) [modulo 86400 seconds]
ΔtUTC = ΔtLS + A0 + A1 (tE - tot + 604800 (WN - WNt))

tE 는 수신기가 추정한 GPS 시간입니다. ΔtLS 가 윤초로 생긴 차이이고, ΔtUTC 는 거기에 두 타임스케일을 잇는 보정 항을 더한 값입니다. 수신기는 GPS 시간에서 이 값을 빼서 UTC 를 냅니다.

1980년 출발 뒤로 UTC 에는 윤초가 18번 들어갔습니다. 그래서 지금 GPS 시간은 UTC 보다 18초 앞서 있습니다. 장비에서 받은 값이 GPS 시간인지 확인하지 않고 UTC 로 저장하면, 다른 서버가 UTC 로 찍은 로그와 섞을 때 18초 안쪽 사건들의 앞뒤가 뒤바뀔 수 있습니다.

갈래

타임스케일은 두 축으로 갈립니다. 하나는 1초를 원자시계로 재나 지구 자전으로 재나이고, 다른 하나는 윤초로 끊김을 두나입니다. 이 절은 자주 만나는 다섯을 두 축 위에 놓고, 서로 몇 초 떨어져 있는지를 봅니다.

타임스케일 1초를 재는 것 윤초
TAI 원자시계 안 받는다
UTC 원자시계 · TAI 와 같은 박자 받는다
UT1 지구 자전 해당 없음
GPS 시간 원자시계 안 받는다
유닉스 시간 UTC 를 따른다 세지 않는다
flowchart TD
    A["원자시계 여럿"] --> T["TAI · 윤초를 안 받는다"]
    T -->|"19초 뒤 · 늘 같다"| G["GPS 시간"]
    T -->|"37초 뒤 · 윤초마다 1초씩 는다"| U["UTC · 윤초를 받는다"]
    E["UT1 · 지구 자전"] -.->|"0.9초 안으로 붙잡는다"| U
    U -->|"윤초를 세지 않는다"| X["유닉스 시간"]

원자시계에서 TAI 가 나옵니다. GPS 시간은 TAI 에서 늘 같은 19초 뒤에 있고, UTC 는 윤초가 들어갈 때마다 1초씩 더 뒤로 물러납니다. UTC 만 옆에서 지구 자전에 붙잡힙니다. 유닉스 시간은 UTC 를 윤초 없이 옮겨 적은 수입니다.

TAI

세계 여러 기관의 원자시계 자료를 모아 BIPM(Bureau International des Poids et Mesures, 국제도량형국)이 만드는 원자 타임스케일입니다. 1958년 1월 1일을 기점으로 끊김 없이 흐릅니다. UTC 는 이 TAI 와 정수 초만큼 떨어져 있습니다.

UTC

TAI 와 박자가 같고 정수 초만큼 다릅니다. UT1 과의 차이를 ±0.9초 안에 두려고 윤초를 받습니다. 윤초는 그달의 마지막 초로 넣고, 12월 말과 6월 말이 먼저입니다. 1972년 6월 30일에 첫 윤초가 들어간 뒤로 지금까지의 윤초는 전부 1초를 더하는 쪽이었습니다.

사람이 쓰는 시각과 로그, 인터넷 타임스탬프가 UTC 를 바탕으로 합니다. 지역마다 다른 시간대 규칙은 복잡하고, 지역의 법에 따라 예측할 수 없는 때에 바뀔 수 있습니다. 그래서 시스템끼리 시각을 주고받는 형식은 지역 시각 대신 UTC 를 기준으로 삼습니다.

UT1

지구 자전으로 재는 세계시 가운데, 자전축에 대한 지구의 작은 움직임을 보정한 타임스케일입니다. 지구가 돈 각도에 바로 대응하므로 1초의 간격이 고르지 않습니다.

표준 시각을 알리는 방송 신호인 시보는 UT1 − UTC 의 예보값을 함께 내보냅니다. 이 값을 DUT1(UT1 − UTC 예보값)이라고 부릅니다. DUT1 의 크기는 0.8초를 넘지 않아야 합니다. UTC 에 DUT1 을 더하면 UT1 에 더 가까운 값을 얻습니다.

GPS 시간

1980년 1월 6일 0시 UTC 에 맞춰 출발했고, 그 뒤로 윤초를 받지 않습니다. 출발한 1980년에 TAI − UTC 는 19초였습니다. 그래서 GPS 시간은 TAI 보다 19초 뒤에 있고, 둘 다 윤초를 받지 않으므로 이 차이는 초 단위로 바뀌지 않습니다.

UTC 와의 차이는 두 값을 빼서 나옵니다. 37초에서 19초를 빼면 18초이고, 지금 GPS 시간은 UTC 보다 18초 앞서 있습니다.

유닉스 시간

UTC 를 하루 86400초로 셈해 1970년 1월 1일부터 센 수입니다. 운영체제의 time() 함수가 돌려주는 값이 이것입니다. 윤초를 세지 않으므로 경과한 초를 그대로 세는 수가 아니라 그 근삿값이고, 윤초 순간에 실제 UTC 와 어떻게 맞출지는 정해져 있지 않습니다.

경계

서버의 시간대를 서울로 바꾸거나 서머타임이 시작되면 타임스케일이 바뀌나. 아닙니다.

시간대는 지역마다 UTC 에 더하는 시간 차이, 곧 UTC 오프셋을 정합니다. 오프셋은 「지역 시각 − UTC」로 셉니다. 18:50:00-04:00 은 22:50:00Z 와 같은 순간입니다. 시간대를 바꾸면 이 오프셋만 바뀌고, 밑에서 세는 UTC 번호는 그대로입니다.

서머타임은 지역의 법이나 관행에 따라 표준시에서 시각을 앞당기거나 늦추는 규칙입니다. 서머타임이 시작되면 오프셋이 바뀌어 지역 시각이 건너뜁니다. 이때도 UTC 번호에는 끊김이 없습니다.

윤초는 반대입니다. 윤초는 UTC 자신에 1초를 끼워 번호에 끊김을 만듭니다. 그래서 윤초는 모든 시간대에서 한 순간에 일어나고, 시간대 사이의 관계는 바뀌지 않습니다. 시간대 정보 파일 형식 TZif(Time Zone Information Format)도 둘을 갈라 담습니다. 오프셋과 서머타임 변경은 전환 시각으로, 윤초는 따로 윤초 보정값으로 적습니다.

관련 항목

타임스케일의 하위 종류

TAI · UTC · UT1 · GPS 시간 · 유닉스 시간 · UT0 · 지구시 · 천체력시 · 그리니치 평균시

타임스케일의 1초와 기점을 정하는 기준

원자시계 · 초 · 국제단위계 · 에포크 · 지구 자전

타임스케일을 지구 자전에 맞추는 보정

윤초 · 윤초 문지르기 · DUT1 · leap-seconds.list · Bulletin C

타임스케일을 정하고 알리는 기구

BIPM · IERS · CGPM · CIPM · ITU-R

타임스케일 위의 값을 적는 표기

타임스탬프 · ISO 8601 · RFC 3339 · UTC 오프셋 · TZif

타임스케일 위에 얹히는 지역 시각 규칙

시간대 · 서머타임 · IANA 시간대 데이터베이스 · 그레고리력 · 민간 시각

타임스케일을 기기에 나르고 읽는 프로토콜과 시계

NTP · PTP · GNSS · IS-GPS-200 · 시간 동기화 · 벽시계 · 단조 시계 · 시스템 시계 · CLOCK_REALTIME · CLOCK_TAI · 시간과 시계

다른 이름: time scale · timescale · 시간 척도 · 시각 척도