사전 타임스케일
개념

타임스케일

gabury1고친 사람 github-actions[bot]

타임스케일은 시각에 번호를 매기는 방법을 하나로 정해 줍니다. 같은 순간이라도 어느 타임스케일로 세느냐에 따라 값이 많게는 수십 초 벌어집니다. 그래서 시각을 주고받을 때는 어느 타임스케일인지부터 맞춰야 합니다. 그래프 축의 시간 눈금을 부르는 말과는 다른 뜻입니다.

쉽고 빠른 이해

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

어느 규칙으로 센 값인지 모르고 섞으면 기록끼리 수십 초씩 어긋납니다. 그러면 먼저 일어난 일이 나중에 일어난 것처럼 보입니다.

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

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

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

상세

이 절은 타임스케일이 정하는 세 가지, 자주 만나는 타임스케일 다섯과 그 사이의 차이, 윤초 1초를 적는 법, 서버 코드에서 차이가 드러나는 때를 차례로 봅니다.

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

타임스케일(time scale)은 시각에 번호를 매기는 규칙입니다. 같은 순간이라도 규칙이 다르면 다른 번호를 받습니다. 「2017년 1월 1일 0시 0분 0초」라는 값은 어느 타임스케일로 센 것인지 알아야 한 순간을 가리킵니다.

잘 만든 타임스케일은 번호가 한 방향으로만 늘어납니다. 늘 앞으로만 가는 계수기 하나를 떠올리면 됩니다. 이 계수기의 값을 날짜와 시각으로 풀어 적은 것이 우리가 보는 시각입니다.

타임스케일이 정하는 세 가지

타임스케일 하나를 세우려면 세 가지를 정해야 합니다.

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

첫째 줄의 원자시계는 원자가 내는 전자기파의 떨림을 세어 1초를 잽니다. 이 떨림은 빠르기가 늘 같아서 1초의 길이가 흔들리지 않습니다. 지구가 도는 속도는 조금씩 흔들리므로 그것으로 잰 1초는 날마다 미세하게 다릅니다.

셋째 줄에서 끼우는 1초를 윤초라고 부릅니다. 원자시계로 센 시각은 지구 자전으로 잰 시각과 서서히 벌어집니다. 벌어진 만큼을 1초 단위로 메우는 것이 윤초입니다.

자주 만나는 타임스케일 다섯

백엔드 개발자가 로그와 장비에서 마주치는 타임스케일은 대개 다섯입니다. 아래 표는 위의 세 가지 가운데 1초와 보정 규칙으로 이들을 견줍니다.

이름 1초를 정하는 것 윤초 주로 쓰는 곳
TAI(International Atomic Time, 국제원자시) 원자시계 안 받는다 세계 시각의 뿌리가 되는 계산
UTC(Coordinated Universal Time, 협정 세계시) 원자시계 받는다 사람이 쓰는 시각 · 로그 · 네트워크 시각 맞추기
UT1(Universal Time 1, 세계시 1) 지구 자전 해당 없음 천문 관측 · 항법
GPS 시간(Global Positioning System time, 위성 항법 시스템 시간) 원자시계 안 받는다 위성 항법 수신기
유닉스 시간 UTC 를 따라간다 세지 않는다 운영체제와 데이터베이스의 타임스탬프

TAI 는 세계 여러 연구소의 원자시계 값을 모아 평균 낸 시각입니다. 끊기지 않고 1초씩 늘기만 합니다. 다른 타임스케일은 대개 TAI 에서 몇 초를 빼거나 더해 얻습니다.

UTC 는 TAI 와 같은 박자로 갑니다. 대신 지구 자전으로 잰 시각인 UT1 과 0.9초 넘게 벌어지지 않도록 윤초를 넣습니다. 사람의 하루는 해가 뜨고 지는 것으로 정해지므로, 사람이 쓰는 시각의 바탕은 UTC 입니다.

GPS 시간은 위성 항법 시스템이 쓰는 타임스케일입니다. 1980년 1월 6일에 UTC 와 맞춰 놓고 출발했습니다. 그 뒤로 윤초를 한 번도 받지 않았습니다. 그래서 그 뒤에 쌓인 윤초만큼 UTC 보다 앞서 있습니다.

유닉스 시간은 1970년 1월 1일 0시 UTC 를 0으로 삼습니다. 이 기점을 에포크라고 부릅니다.

유닉스 시간은 에포크부터 하루를 언제나 86400초로 치고 센 초를 숫자 하나로 적습니다. 실제로 흐른 초와는 윤초만큼 다릅니다. 윤초 1초에는 붙일 번호가 없습니다.

타임스케일 사이의 차이

2017년 1월 1일부터 TAI 는 UTC 보다 37초 앞서 있습니다. 윤초 제도는 1972년에 시작됐고, 그때 두 타임스케일은 이미 10초 벌어져 있었습니다. 그 뒤로 윤초가 27번 들어가 37초가 됐습니다. 새 윤초가 들어가면 이 값이 1초 늘어납니다.

GPS 시간은 TAI 보다 언제나 19초 뒤에 있습니다. GPS 시간이 출발한 1980년에 TAI 와 UTC 의 차이가 19초였기 때문입니다. 두 타임스케일 모두 윤초를 안 받으므로 이 차이는 바뀌지 않습니다.

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

flowchart TD
    A["원자시계 여럿"] --> T["TAI · 윤초를 안 받는다"]
    T -->|"19초를 뺀다 · 늘 같다"| G["GPS 시간"]
    T -->|"37초를 뺀다 · 윤초마다 는다"| U["UTC · 윤초를 받는다"]
    E["지구 자전 · UT1"] -.->|"0.9초 안으로 붙잡는다"| U
    U -->|"윤초를 세지 않는다"| X["유닉스 시간"]

원자시계에서 TAI 가 나옵니다. GPS 시간은 TAI 에서 늘 같은 19초를, UTC 는 윤초마다 늘어나는 초를 뺀 값입니다. UTC 만 옆에서 지구 자전의 영향을 받습니다. 유닉스 시간은 UTC 를 윤초 없이 옮겨 적은 값입니다.

윤초 1초를 적는 법

타임스케일 사이의 차이가 가장 잘 드러나는 때는 윤초가 들어가는 순간입니다. 마지막 윤초는 2016년 12월 31일 끝에 들어갔습니다. 그 앞뒤 세 순간을 세 타임스케일로 적으면 이렇습니다.

UTC TAI 유닉스 시간
2016-12-31 23:59:59 2017-01-01 00:00:35 1483228799
2016-12-31 23:59:60 2017-01-01 00:00:36 제 번호가 없다
2017-01-01 00:00:00 2017-01-01 00:00:37 1483228800

TAI 는 35, 36, 37로 쉼 없이 1초씩 늡니다. UTC 는 초 칸에 60 이라는 번호를 하나 더 써서 그 1초를 받습니다. 그날 마지막 1분은 61초가 됩니다.

유닉스 시간은 두 번호 사이에 끼인 1초를 적을 방법이 없습니다. 시스템은 두 길 가운데 하나로 이 1초를 넘깁니다.

첫째 길은 이 1초 동안 앞 번호를 한 번 더 쓰는 것입니다. 같은 번호가 두 번 나오므로 번호만 보고는 두 순간을 가를 수 없습니다.

둘째 길은 앞뒤 몇 시간에 걸쳐 1초를 잘게 나눠 흡수하는 것입니다. 이 방법을 윤초 문지르기(leap smear)라고 부릅니다.

서버 코드에서 차이가 드러나는 때

타임스케일의 차이는 평소에는 안 보입니다. 서버가 쓰는 시각이 전부 UTC 에서 나오기 때문입니다. 아래 세 경우에는 이 차이가 버그로 드러납니다.

첫째는 GPS 시간을 UTC 로 알고 저장할 때입니다. 위성 항법 장비에서 받은 값이 어느 타임스케일인지 확인하지 않고 저장하면 18초 앞선 시각이 될 수 있습니다. 다른 서버가 UTC 로 찍은 로그와 섞으면 사건의 앞뒤가 뒤바뀔 수 있습니다.

둘째는 타임스탬프 두 개를 빼서 흐른 시간을 셀 때입니다. 위 표에서 첫 줄과 셋째 줄의 유닉스 시간 차이는 1초입니다. 흐른 시간은 2초입니다. 흐른 시간을 재려면 시각이 아니라 단조 시계를 씁니다. 단조 시계는 기계가 켜진 뒤 흐른 시간만 세므로 윤초에 흔들리지 않습니다.

셋째는 시각 문자열을 읽을 때입니다. 인터넷 프로토콜에서 시각을 적는 형식인 RFC 3339(Request for Comments 3339, 인터넷 날짜·시각 표기 규약)는 초 칸에 60 을 허용합니다. 받는 코드가 초 칸을 0부터 59까지만 받게 짜여 있으면 윤초가 든 값에서 오류를 냅니다.

타임스케일 위의 시간대와 서머타임

시간대와 서머타임은 타임스케일이 아닙니다. 둘 다 UTC 로 센 값을 사람에게 보여 줄 때 덧씌우는 규칙입니다.

시간대는 지역마다 UTC 에 더하는 고정된 시간입니다. 이 차이를 UTC 오프셋이라고 부릅니다. 서울은 UTC 에 9시간을 더하고, 이렇게 얻은 값이 서울의 지역 시각입니다.

서머타임은 여름철에 그 오프셋을 한 시간 늘리는 규칙입니다. 서머타임이 시작하는 날에는 지역 시각이 한 시간 건너뜁니다. 그래도 밑에서 세는 UTC 는 한 번도 끊기지 않습니다.

윤초는 다릅니다. 윤초는 UTC 자신에 1초를 끼우므로 밑에서 세는 번호가 바뀝니다.

같은 이름의 다른 뜻

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

관련 항목

타임스케일의 하위 종류

TAI · UTC · UT1 · GPS 시간 · 유닉스 시간 · 그리니치 평균시

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

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

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

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

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

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

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

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

타임스케일을 기기에 나르고 따라가는 시계와 프로토콜

NTP · PTP · 시간 동기화 · 벽시계 · 단조 시계 · 시스템 시계 · 시간과 시계

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