2장. 기차가 시간을 통일하다 — 표준시와 타임존의 탄생

만화로 보는 요약 — 먼저 읽어보세요
마을마다 다른 정오 → 철도 안전을 위한 표준시 → 법과 역사로 쌓인 ZoneId의 결정 이력.
면접 실전 질문: ① 타임존 오프셋이 경도 공식만으로 정해지지 않는 이유는? ② 같은 나라 안에 여러 타임존이 생기는 이유는? ③ ZoneId와 ZoneOffset은 언제 각각 써야 하는가?
표준시는 하늘이 준 사실이 아니라 철도회사와 정부가 내린 결정이다 — 그래서 타임존은 공식이 아니라 법령을 모아둔 데이터베이스다.
면접 실전 질문: ① 왜 인도는 UTC+05:30처럼 30분 단위 오프셋을 쓰는가? ②
ZoneId의 오프셋이 경도로 계산되지 않는 이유는? ③ 같은 나라 안에서 타임존이 여러 개로 쪼개지는 이유는?
배경 — 기차가 훔쳐간 것
1장은 이 질문으로 끝났습니다. 마을마다 정오가 달랐고, 그 차이는 걸어서 며칠 걸리는 세상에선 아무 문제가 없었죠. 그런데 그 거리를 한 시간 만에 주파하는 쇳덩이가 나타나면 어떻게 될까요.
정오가 마을마다 다른 이유는 명확합니다. 경도 1도 차이는 정확히 4분의 시차입니다(지구 자전 360도가 24시간에 걸리니까요). 오차가 아니라 천문학적으로 정확한 값이었어요. 문제는 이 정확함이 철도에게는 재앙이었다는 겁니다. 기차는 여러 마을의 서로 다른 정오를 단 하나의 시각표로 꿰뚫어야 했고, 역무원과 기관사는 그 시각표를 보며 단선 구간에서 열차를 통제해야 했습니다. 지역시의 차이가 이제는 충돌 위험이 됐습니다.
스토리 — 기차가 시각표를 들고 나타나다
19세기, 철도가 이 무해했던 차이를 문제로 바꿔놓습니다. 기차는 여러 마을을 하나의 시각표로 꿰뚫고 지나갑니다. 그런데 그 시각표에 적힌 “3시 출발”이 어느 마을의 3시일까요? 출발역의 3시와 도착역의 3시는 다른 순간인데, 시각표는 숫자 하나뿐입니다.
더 심각한 건 역무원과 기관사였습니다. 이들은 각 역의 지역시(local time)에 맞춰진 시계를 보며 열차를 통제했어요. 두 열차가 단선 구간에서 교행할 시각을 지역시로 각자 계산하면, 역마다 몇 분씩 어긋난 그 차이가 그대로 충돌 위험이 됩니다. 시각의 불일치가 이제는 감성의 문제가 아니라 안전의 문제가 된 거예요.
영국 **그레이트웨스턴철도(GWR)**가 1840년 11월, 법이 시키지도 않았는데 먼저 움직입니다. 모든 역의 시계를 그리니치 천문대 시각, 즉 런던 시간(GMT) 하나로 통일해버린 거예요. 자기 노선 안에서는 더 이상 지역시를 쓰지 않겠다는 선언이었습니다. 이후 다른 철도회사들도 뒤따랐고, 1847년 무렵에는 대부분의 영국 철도가 이 **철도 시간(Railway Time)**을 쓰고 있었습니다. 그런데 정작 이게 영국 전역의 법정 시간으로 공식 인정된 건 한참 뒤인 1880년 의회 입법에서였습니다. 즉 철도가 먼저 시간을 통일했고, 법은 그 뒤를 따라갔습니다.
북미 대륙은 사정이 더 심했습니다. 나라가 넓어서 지역시 차이가 영국보다 훨씬 컸고, 철도회사도 훨씬 많아서 회사마다 제각각 자기 기준시를 쓰고 있었어요. 한 역에 시계가 여러 개 걸려 있고, 그중 어느 것도 서로 맞지 않는 상황이 실제로 벌어졌습니다.
이걸 정리한 사람이 철도 시각표 편집자였던 **윌리엄 앨런(William F. Allen)**입니다. 그는 대륙을 동부·중부·산악·태평양, 이렇게 네 개의 표준 시간대로 나누는 안을 냈고, 철도회사들이 이 안에 합의했습니다. 1883년 11월 18일, 미국과 캐나다의 철도 시계가 정오에 일제히 새 표준으로 다시 맞춰졌습니다. 이날을 두고 흔히 “두 번의 정오가 있었던 날”이라 부릅니다. 동쪽 절반의 도시들은 원래 지역시로 정오를 한 번 맞았다가, 새 표준시로 시계를 되돌리면서 정오를 한 번 더 맞았거든요. 짚어둘 점은, 이건 미국 연방 법률이 아니라 철도회사들의 자발적 합의였다는 겁니다. 미국이 표준시를 법으로 명문화한 건 그로부터 35년 뒤인 1918년 표준시간법(Standard Time Act)에서였고요.
두 대륙에서 벌어진 일은 본질이 같습니다. 철도라는 기술이 먼저 통일된 시간을 요구했고, 정부와 법은 그 필요를 뒤늦게 승인했습니다. 시간은 이 순간부터 하늘의 관측이 아니라 행정의 결정이 됩니다.
철도가 각자 자기 대륙을 통일하고 나자, 다음 질문이 자연스럽게 따라옵니다. 대륙과 대륙은 어떻게 맞출 것인가. 1884년, 워싱턴 D.C.에서 국제자오선회의(International Meridian Conference)가 열립니다. 25개국에서 온 41명의 대표가 모여 두 가지를 정했어요. 경도 0도의 기준을 그리니치로 삼는다, 그리고 하루를 자정에서 자정까지로 세는 만국통일일(universal day) 개념을 도입한다.
여기서 흔히 오해하는 게 있습니다. 이 회의가 “전 세계를 24개 시간대로 나누자”고 의결한 건 아니었어요. 회의는 **기준점(그리니치)**과 날짜 세는 법을 정했을 뿐, 경도 15도씩 24개 구역으로 나누는 시간대 체계 자체는 이미 철도회사들의 실무(북미의 4개 표준시가 그 실례)에서 나와 있던 아이디어가 각국에 점진적으로 퍼져나간 결과에 가깝습니다. 그리고 그 확산은 결코 빠르지도, 보편적이지도 않았습니다. 프랑스는 자국 자오선(파리)에 대한 자존심 때문에 그리니치 기준을 한동안 받아들이지 않았고, 실제로는 “파리 평균시에서 9분 21초를 뺀 시각”이라는 우회적인 표현으로 그리니치 표준시를 20세기 초까지 에둘러 썼습니다. 표준시는 발명되자마자 세계에 동시에 깔린 게 아니라, 나라마다 다른 속도로, 다른 이유로 받아들여진 겁니다.
핵심 — 오프셋은 계산이 아니라 결정이다
여기서 백엔드 개발자에게 중요한 결론이 나옵니다. 오프셋의 값은 뜻밖에 경도에서 정확히 계산되는 경우가 많습니다. 정치가 끼어드는 지점은 따로 있어요 — 어느 자오선을 표준으로 삼을지, 그리고 그 자오선을 얼마나 넓은 땅에 강제할지는 정부가 내린 결정입니다. 실제로 확인해볼까요.
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
public class SolarVsLegal {
record City(String name, double longitude, String zoneId) {}
public static void main(String[] args) {
City[] cities = {
new City("Madrid", -3.70, "Europe/Madrid"),
new City("London", -0.13, "Europe/London"),
new City("Urumqi", 87.62, "Asia/Shanghai"),
new City("Beijing", 116.40, "Asia/Shanghai")
};
for (City c : cities) {
double solarOffsetHours = c.longitude() / 15.0;
ZoneId zone = ZoneId.of(c.zoneId());
ZoneOffset legalOffset = ZonedDateTime.now(zone).getOffset();
System.out.printf("%-8s 경도 %+7.2f° 태양시 오프셋 %+5.2fh 법정 오프셋(%s) = %s%n",
c.name(), c.longitude(), solarOffsetHours, c.zoneId(), legalOffset);
}
}
}Madrid 경도 -3.70° 태양시 오프셋 -0.25h 법정 오프셋(Europe/Madrid) = +02:00
London 경도 -0.13° 태양시 오프셋 -0.01h 법정 오프셋(Europe/London) = +01:00
Urumqi 경도 +87.62° 태양시 오프셋 +5.84h 법정 오프셋(Asia/Shanghai) = +08:00
Beijing 경도 +116.40° 태양시 오프셋 +7.76h 법정 오프셋(Asia/Shanghai) = +08:00경도로 계산한 태양시는 마드리드나 런던이나 거의 같습니다(둘 다 그리니치 근처니까요). 그런데 법정 오프셋은 마드리드가 런던보다 한 시간 더 큽니다. 1940년, 스페인이 나치 독일에 발맞춰 자국 표준시를 독일 시간대로 바꿔버린 정치적 결정의 흔적이 지금도 남아 있는 거예요. 우루무치와 베이징은 더 극단적입니다. 두 도시의 태양시는 거의 두 시간 차이가 나지만, 중국은 **국토 전체를 단 하나의 표준시(UTC+8, 베이징 시간)**로 통일해버렸습니다. 신장 위구르 지역 주민들이 실생활에서 공식 시계보다 1~2시간 늦은 “비공식 시간”을 관습적으로 쓰는 이유가 여기 있습니다. 지도 위의 경도선과 실제 법정 시각 사이에는 정치가 채워 넣은 간극이 있는 겁니다.
같은 이유로, 오프셋이 항상 정각 단위인 것도 아닙니다.
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.util.Arrays;
public class OffsetZoo {
public static void main(String[] args) {
String[] zones = {"Asia/Kolkata", "Asia/Kathmandu", "Australia/Eucla", "Pacific/Chatham"};
for (String z : zones) {
ZoneOffset offset = ZonedDateTime.now(ZoneId.of(z)).getOffset();
System.out.printf("%-18s %s%n", z, offset);
}
System.out.println();
System.out.println("등록된 타임존 총 개수 = " + ZoneId.getAvailableZoneIds().size());
System.out.println("예시 5개: " + Arrays.asList(
ZoneId.getAvailableZoneIds().stream().sorted().limit(5).toArray()));
}
}Asia/Kolkata +05:30
Asia/Kathmandu +05:45
Australia/Eucla +08:45
Pacific/Chatham +12:45
등록된 타임존 총 개수 = 604
예시 5개: [Africa/Abidjan, Africa/Accra, Africa/Addis_Ababa, Africa/Algiers, Africa/Asmara]인도는 +05:30을 씁니다. 이 30분 단위, 사실 계산 자체는 아주 깔끔합니다. 인도 표준시의 기준 자오선은 미르자푸르(지금의 프라야그라지 인근)를 지나는 **동경 82°30′**이고, 1905년 영국령 인도 총독 커즌이 확정한 값이에요. 82.5 ÷ 15 = 정확히 5.5시간 — 교과서적인 경도 계산 그대로입니다. 정각 사이 어딘가에서 대충 타협한 숫자가 아니에요.
정치가 개입한 지점은 숫자가 아니라 선택입니다. 인도 국토는 서쪽 구자라트(약 동경 68도) 부터 동쪽 아루나찰프라데시(약 동경 97도)까지, 자연스러운 지역시 기준이라면 표준시간대가 두 개는 필요한 폭입니다. 그런데 인도는 이 폭 전체에 단 하나의 자오선을 강제했습니다. 1906년 IST가 시행된 뒤에도 콜카타·뭄바이 같은 도시는 한동안 자체 지역시를 따로 유지했고, 1947년 독립 이후에야 전국이 서서히 하나의 표준시로 수렴했습니다. 정치가 한 일은 계산을 왜곡한 게 아니라, 두 개로 쪼개져야 할 나라를 하나의 시계로 묶은 것입니다.
네팔의 +05:45도 비슷합니다. 기준 자오선은 카트만두 동쪽 가우리샹카르 봉 부근의 **동경 86°15′**이고, 86.25 ÷ 15 = 5.75시간, 즉 5시간 45분도 그 자체로 정확한 경도 계산입니다. 정치는 여기서도 값이 아니라 기준점 선택에 있었어요. 네팔은 1920년부터 인도와 같은 +05:30을 쓰다가, 1986년 자국 영토 안에 있고 지리적 중심에 더 가까운 가우리샹카르를 기준점으로 갈아타면서 인도와 15분 차이 나는 시간대로 옮겨갔습니다. 정치적으로 고른 기준점이 낳은 결과인 셈이죠.
호주의 유클라(Eucla)는 결이 다릅니다. 인구 백여 명짜리 이 마을은 자기만의 +08:45를 쓰는데, 이건 연방 정부가 법으로 정한 시간대가 아닙니다. 서호주(+08:00)와 사우스오스트레일리아 (+09:30) 경계에 낀 주민들이 오래전부터 관습적으로 써온 비공식 절충안이에요. 계산도 입법도 아니고, 그냥 동네 관습이 굳어진 겁니다.
참고로 위 출력 중 Pacific/Chatham +12:45와 타임존 총 개수(604)는 이 글을 쓴 시점, 이
JDK가 담고 있는 tzdata 버전에서 관측된 값입니다. 채텀 제도는 뉴질랜드 서머타임 기간엔
+13:45로 바뀌고, 개수도 어느 나라가 표준시를 새로 legislate하느냐에 따라 다음 tzdata
릴리스에서 달라질 수 있습니다. 이건 흠이 아니라 오히려 이 장의 결론 그대로예요. 타임존
데이터베이스가 버전을 갖는 이유는, 시간대가 물리 법칙이 아니라 입법의 기록이기 때문입니다.
ZoneId.getAvailableZoneIds()가 반환하는 600여 개의 문자열도 같은 이야기를 합니다. 이건
수식 하나로 계산되는 목록이 아니라, IANA가 관리하는 입법 기록의 데이터베이스예요.
Asia/Seoul, Europe/Madrid 같은 각 항목 뒤에는 “언제 이 나라가 표준시를 몇 시로
바꿨는가”라는 역사적 결정이 통째로 들어 있습니다. ZoneId가 지역 이름(Asia/Seoul)으로
설계되고 단순 오프셋(+09:00)만으로 끝내지 않은 이유가 여기 있어요. 오프셋은 나라가 마음을
바꾸면 언제든 바뀔 수 있는 값이고, 그 변경 이력을 기억하려면 “장소”라는 키가 필요했던
겁니다. 이 데이터베이스의 구조는 5장에서 더 깊이 들어갑니다.
정리
- 지역시는 마을마다 실제로 정확했다. 경도 1도 = 4분 차이는 오차가 아니라 천문학적 사실이고, 이동 속도가 느렸던 시절엔 문제가 되지 않았다.
- 철도가 이 차이를 문제로 만들었다. 하나의 시각표가 여러 지역시를 관통하면서 열차 충돌 위험까지 낳았다. 영국 GWR은 1840년부터 법보다 먼저 GMT로 시계를 통일했다(전국 법제화는 1880년).
- 북미 철도는 1883년 11월 18일, 대륙을 4개 표준시로 통일했다(“두 번의 정오가 있었던 날”) — 이 역시 정부가 아니라 철도회사들의 합의였다.
- 1884년 국제자오선회의는 그리니치를 본초자오선으로, 만국통일일을 정했을 뿐, 24개 시간대 체계 자체는 이미 실무에서 나온 관행이 각국에 점진적으로, 불균등하게 퍼진 결과다.
- 결론: 오프셋의 값은 종종 경도 계산 그대로다(인도 +05:30 = 82.5°E÷15, 네팔 +05:45 =
86.25°E÷15). 정치가 개입하는 지점은 값이 아니라 어느 자오선을 표준으로 정하고, 그
자오선을 얼마나 넓은 땅에 강제하는가다 — 스페인·중국이 법으로 지리를 뒤덮은 사례고,
인도·네팔은 하나의 자오선을 나라 전체(또는 이웃 나라와 다른 기준점)에 강제한 사례다.
타임존 총 개수·오프셋 값 자체도 tzdata 버전과 관측 시점에 따라 달라진다 — 이 역시 시간대가
물리 법칙이 아니라 입법 기록이라는 증거다. 그래서
ZoneId는 오프셋이 아니라 지역 이름 + 결정 이력의 데이터베이스로 설계됐다.
생각해볼 질문: 표준시가 정치적 결정이라면, 그 결정을 내리는 기준시계는 무엇이었을까요? 1884년의 그리니치 표준시는 지구의 자전을 기준으로 삼았습니다. 하늘이 다시 등장하는 것처럼 보이지만, 사실 지구의 자전은 미묘하게 흔들리고 느려집니다. 하루가 정확히 86,400초라는 보장이 없다는 뜻이에요. 정치가 표준시의 경계를 그었다면, 그 시계바늘 자체의 정확성은 누가 책임질까요?