ClockHub
블로그위젯문의하기
전체 글
레퍼런스9 분 소요

CST는 서로 다른 세 시각이다

누군가 회의 초대에 "CST 3pm"이라고 적어 세 나라에 흩어진 팀에게 보냈다.

베이징의 동료에게는 15:00으로 뜬다. 시카고의 동료에게는 01:00. 아바나의 동료에게는 02:00. 세 사람, 한 줄, 세 개의 시각 — 그리고 아무도 잘못 읽지 않았다. 셋 다 "CST"의 올바른 읽기다.

처음과 마지막의 차이는 열네 시간. 반올림 오차도, 서머타임의 예외도 아니다. 하루 업무 시간 전체가, 모두가 모호함이 없다고 믿었던 세 글자 안에 들어 있다.

이것은 부주의에 관한 이야기가 아니다. 표기법의 실패에 관한 이야기다. 읽는 사람이 쓰는 사람의 위치를 이미 알고 있던 세계를 위해 만들어진 표기법이, 그 전제를 잃었을 때 무슨 일이 벌어지는가.

I. 세 글자, 네 곳

CST는 이 체계에서 가장 붐비는 약어지만, 특별한 사례는 아니다.

약어정식 명칭오프셋
CST중국 표준시UTC+8
CST쿠바 표준시UTC−5
CST중부 표준시(북미)UTC−6
CST중부 표준시(중미)UTC−6

네 개의 이름, 세 개의 오프셋. 게다가 CST는 ACST(오스트레일리아 중부 표준시)의 변형 표기로도 널리 쓰이며, 여기에 UTC+9:30이 네 번째로 더해진다.

IST는 더 정돈돼 있지만 모호하기는 마찬가지다. 인도 표준시가 UTC+5:30, 이스라엘 표준시가 UTC+2, 아일랜드 표준시가 UTC+1. 세 개의 이름, 세 개의 오프셋, 하나의 문자열.

BST는 방글라데시 표준시 UTC+6, 부건빌 표준시 UTC+11, 영국 서머타임 UTC+1이다.

24시간 눈금 위 01:00, 02:00, 15:00 지점에 표시가 있고 각각 Central, Cuba, China로 적혀 있다. 같은 순간에 셋 다 CST를 가리킨다

같은 순간, 하나의 약어에 대한 세 가지 올바른 읽기. 첫 표시와 마지막 표시 사이는 14시간 — 15:00 빼기 01:00.

어느 것도 오타도, 우연히 살아남은 유물도 아니다. 매일 쓰인다. 공식 문서에도, 항공 시간표에도, 캘린더 초대에도 등장한다.

II. 약어는 '그 자리의 독자'를 위해 만들어졌다

시간대 약어는 멀리 전달되도록 설계되지 않았다. 바로 옆에 있는 사람이 읽도록 만들어졌다.

이 표기는 철도 시대에서 나왔다. 1883년 미국 철도가 대륙을 네 개의 표준 시간대로 나눴을 때, 시간표에는 극도로 짧은 라벨이 필요했다. 역무원이 좁은 칸에 넣을 수 있고, 승객이 한눈에 읽을 수 있는 것. "CST"는 그 역할을 완벽히 해냈다. 그 시간표를 읽는 사람은 모두 같은 시간대에 있었기 때문이다.

전보도, 상업 서신도, 해운 통보도 같은 논리다. 약어가 성립한 것은 문맥이 암묵적으로 공유됐기 때문이다. 시카고에서 온 편지에 "CST"라고 적혀 있으면 시카고의 수신자는 당연히 알고, 뉴욕의 수신자도 소인에서 짐작할 수 있었다.

이것이 약어의 본래 기능이다. 문맥을 가리키는 것이지, 문맥을 대신하는 것이 아니다. 문맥을 벗겨내면 가리킬 대상이 사라진다.

인터넷은 문맥을 기본값으로 벗겨낸다. 그룹 채팅의 한 줄, 이슈 트래커의 한 항목, 공유 문서의 한 메모 — 어느 것도 소인을 갖지 않는다. 문자열만 도착하고, 읽는 사람은 자기 손에 있는 문맥으로 채운다. 베이징에서는 UTC+8. 시카고에서는 UTC−6. 둘 다 사리에 맞고, 그 차이는 열네 시간.

분명히 해둘 것이 있다. 이 기호들을 승인한 표준 기구는 없다. 시간대 약어는 ISO 8601 — 날짜와 시각 표기를 정하는 국제 표준 — 에 포함되지 않는다. 표준 옆에서 자라난 것이지 표준 안에 들어온 적이 없고, 유일성을 보장하는 방식으로 부여된 적도 없다.

III. 오프셋은 시간대가 아니다

가장 빠른 수정은 "CST"를 버리고 오프셋을 쓰는 것이다. 그것은 분명 더 낫지만 완전하지는 않다. 그리고 '더 나음'과 '완전함' 사이의 틈이 바로 대부분의 캘린더 버그가 사는 곳이다.

오프셋이 답하는 것은 "그곳에서 지금 몇 시인가"다. 시간대가 답하는 것은 "그곳에서 나중에 몇 시가 되는가, 작년에는 몇 시였는가"다. 다른 질문이고, 서머타임을 견디는 것은 후자뿐이다.

2024년에 발표된 RFC 9557은 이 구분을 인터넷 타임스탬프 표준에 처음으로 명시했다. 익숙한 RFC 3339 형식 뒤에 대괄호로 감싼 시간대 이름을 선택적으로 붙인다.

1996-12-19T16:39:57-08:00[America/Los_Angeles]

오프셋과 시간대 이름이 함께 있고, 둘은 중복이 아니다. 오프셋은 이 순간을 고정하고, 시간대 이름은 소프트웨어에게 다른 순간으로 이동하는 방법을 알려준다.

이름이 빠지면 무엇이 깨지는지, 명세는 분명히 적고 있다. 2020-01-01T00:00+01:00[Europe/Paris]로 적힌 타임스탬프는 여섯 달을 더하면 7월에 올바르게 도착한다. 그때 파리는 UTC+2이기 때문이다. 같은 타임스탬프를 2020-01-01T00:00+01:00[+01:00] — 고정 오프셋이 시간대인 척하게 만든 것 — 으로 적으면 한 시간 틀어진다. 파리의 시계는 절대 바뀌지 않는다고 주장해버렸기 때문이다.

RFC의 문장을 그대로 인용한다. 프로그램은 타임스탬프의 UTC 오프셋을 오프셋 시간대로 복사해서는 안 된다. 그렇게 하면 "그 위치의 타임스탬프의 UTC 오프셋이 결코 변하지 않는다고 부당하게 단정"하게 된다.

이 한 문장은 한 종류의 장애를 통째로 설명한다. 고정 오프셋에서 계산한 "다음 분기" 회의는 서머타임 전환을 넘으면 한 시간 틀어진다. 기록할 때 오프셋은 맞았고, 쓸 때 틀렸다.

IV. 반 시간은 어디서 오는가

약어를 믿을 수 없다면 오프셋 자체도 임의로 보인다. 왜 인도는 UTC+5:30이고 네팔은 UTC+5:45인가. 세계 대부분은 정시인데.

계산은 단순하다. 지구는 24시간에 360도를 돈다. 즉 한 시간에 15도, 1도는 4분이다. 시간대 오프셋은 경도를 15로 나눈 값에 지나지 않는다.

인도의 표준 자오선은 동경 82°30′, 즉 82.5도다.

82.5 × 4 = 330분 = 5시간 30분.

0°에서 180°까지의 경도 눈금. 82.5°E에 표시가 있고 UTC+5 띠 안에 있지만 중심에서 벗어나 있다. 아래에 82.5° × 4 min/° = 330 min 계산

자전 1도는 4분. 정시 사이의 자오선을 고르면 소수점이 붙은 오프셋을 물려받는다. 이것은 지리이지 반올림이 아니다.

이 자오선이 선택된 이유는 인도의 동서 끝에서 거의 중간에 있기 때문이다. 인도는 경도로 약 29도, 분으로 바꾸면 116분 — 서쪽 끝과 동쪽 끝의 태양시 차이가 두 시간에 가깝다. 중앙 자오선을 잡으면 그 불편을 한쪽에 몰아주지 않는다.

네팔은 같은 논리를 한 걸음 더 밀었다. 카트만두의 지방 평균 태양시는 UTC+5:41:16이다. 네팔은 UTC+5:30으로 반올림하지 않고 1986년에 시계를 15분 앞당겨 UTC+5:45에 정착했다. 지역 태양시에 가깝고, 이웃 인도와는 의도적으로 맞추지 않았다.

세계에서 45분 오프셋을 쓰는 시간대는 셋뿐이다. 네팔의 UTC+5:45, 채텀 제도의 UTC+12:45, 그리고 오스트레일리아 서부의 비공식 UTC+8:45다. 소수점 오프셋은 드물지만 오류가 아니다. 국가가 "그 지역의 정오에 의미를 두겠다"고 결정한 결과다.

V. 시간대 이름은 정치적 결정이다

소수점 오프셋은 지리에서 온다. 나머지 대부분은 정치에서 온다.

중국이 가장 분명한 예다. 1918년에 제안되고 1947년에 정식 채택된 구분에서 국토는 다섯 시간대로 나뉘었다. 쿤룬이 UTC+5:30, 신장-티베트가 UTC+6, 간쑤-쓰촨이 UTC+7, 중원이 UTC+8, 창바이가 UTC+8:30. 동서 격차는 세 시간.

1949년 새 정부는 전국을 UTC+8(베이징 시간)로 통일했고 다섯 시간대는 사라졌다. 최서단 신장은 계속 흔들렸다. 1969년부터 1986년 사이에 자체 UTC+6과 베이징의 UTC+8 사이를 여러 번 오갔고, 마침내 베이징 시간으로 정착했다.

중국은 1986년부터 1991년까지 서머타임도 시행했고 이후 중단했다. "중국에 서머타임은 없다"는 지금은 참이고, 예전 6년 동안은 거짓이었으며, 태양이 아니라 정책에 관한 사실이다.

인도의 역사도 같은 모양이다. 1906년 1월 1일 단일 표준시를 채택하기 전, 아대륙에는 적어도 세 개의 공식 시각이 돌아다녔다. 봄베이 시간이 UTC+4:51, 캘커타 시간이 UTC+5:53:20, 마드라스 시간이 UTC+5:21:14. 봄베이는 1955년까지 자기 시간을 유지했다. 국가 표준이 생기고 49년 뒤였다.

교훈은 그 나라들이 허술했다는 것이 아니다. 시간대는 행정 경계이지 기하 경계가 아니라는 것이다. 어떤 장소의 오프셋은 그 정부가 마지막으로 정한 값이고, 정부는 결정을 바꾼다.

IANA 데이터베이스가 국가명이 아니라 도시명을 쓰는 이유도 같다. Asia/Shanghai는 상하이만이 아니라 중국 전역을 덮는다. 이름은 시간대의 유래를 표시할 뿐 범위를 표시하지 않는다. "상하이의 시각"이라고 읽은 사람은 답은 맞지만 이유가 틀렸다.

VI. 한 기계 안의 두 가지 명명 체계

도시명을 쓰기로 해도 함정이 하나 더 있다. 두 대형 운영체제가 같은 이름을 쓰지 않는다.

IANA 데이터베이스 — 거의 모든 서버, 스마트폰, 프로그래밍 언어 뒤에 있는 것 — 는 중국의 시간대를 Asia/Shanghai라고 부른다. Windows는 같은 시간대를 China Standard Time이라고 부른다. 둘 다 자기 체계에서는 맞고, 상대 체계에서는 무효다.

영향은 데이터 파이프라인에서 나타난다. Windows에서 도는 서비스가 China Standard Time을 데이터베이스에 쓰고, Linux에서 도는 집계 작업이 읽지 못해 조용히 UTC로 폴백한다. 타임스탬프는 여덟 시간 어긋나고, 예외는 하나도 발생하지 않는다.

해결은 기술이 아니라 규칙이다. 저장은 IANA 이름, 변환은 경계에서. IANA 이름은 이 업계에서 범용 식별자에 가장 가까운 것이고, 공개적으로 관리되며, 어떤 언어와 데이터베이스도 해석할 수 있다.

VII. 전송을 견디는 시각 표기법

세 가지 규칙이면 거의 전부를 덮는다.

오프셋을 쓴다. 약어는 쓰지 않는다. 09:30 UTC+8은 잘못 읽을 수 없다. 09:30 CST는 세 가지로 잘못 읽힌다. 순수 텍스트만 들어가는 칸이라면 오프셋이 실용적 하한이다.

나중에 쓸 시각에는 시간대 이름을 붙인다. 일정, 반복, 저장하는 것은 09:30 Asia/Shanghai로 쓴다. 오프셋은 오늘 맞다. 시간대 이름은 서머타임 전환과 향후 규칙 변경을 넘어도 맞다.

맨 약어를 국경 밖으로 내보내지 않는다. 한 나라 안에서, 모두가 지리를 아는 자리에서는 "CST"로 충분하다. 그것은 예전에도 지금도 그렇다. 메시지가 국경을 넘는 순간 약어는 풀어써야 한다.

회의라면 본문에 시각을 쓰지 않는 것이 확실하다. 진짜 시간대가 붙은 초대를 보내거나, 양쪽을 동시에 보여주는 변환 도구를 쓴다. 사이트의 시간대 변환기와 세계 시계가 바로 그런 용도다. 두 도시를 골라 겹치는 시간을 보고, 서머타임 전환을 넘는 날에 어떻게 되는지 확인한 뒤 정하면 된다.

계약이라면 시간대 이름과 오프셋을 나란히 쓰고, 둘이 어긋날 때 어느 쪽이 우선인지 명시한다. "베이징 시간 오후 5시(UTC+8)"는 오늘도 모호하지 않고, 다음 규칙 변경 이후에도 모호하지 않다.

VIII. 약어는 '문맥 공유'에 대한 주장이다

초대장으로 돌아가자. 세 글자, 세 개의 정답, 열네 시간의 간격. 아무도 부주의하지 않았다. 이 표기법이 지킬 수 없는 약속을 했다. 읽는 사람과 쓰는 사람이 같은 곳에 있다는 약속을.

그 약속은 한 세기 동안 지켜졌다. 대부분의 메시지가 멀리 가지 않았기 때문이다. 철도 시간표, 전보, 소인이 찍힌 편지 — 각각 자기 지리를 품고 이동했다. 인터넷은 포장을 뜯고 라벨만 남겼다.

그래서 "CST"를 읽는 올바른 방법은 시간대로 읽는 것이 아니라, 보낸 사람이 당신이 자기 위치를 안다고 생각한다는 주장으로 읽는 것이다. 그 주장이 맞을 때도 있다. 틀릴 때의 대가는 어리둥절한 회의가 아니다. 놓친 항공편이고, 망가진 배포 시간대이고, 두 변호사가 각자 올바르게 읽으면서 다투는 계약서다.

시각은 결코 숫자만이 아니다. 숫자 더하기 장소다. 약어는 장소를 빼려는 시도이고, 그것이 바로 실패의 이유다.


참고 자료