grep

Engineering

타임존으로 알아보는 우리나라 근현대사

장정호Walter(월터) / 주문결제개발팀여기어때

2025년 5월 22일

원문에서 보기 ↗

ZoneRulesException :: Unknown time-zone ID: Europe/Kyiv

평소에 못 보던 오류가 발생했다. 보자마자 바로 알았다. 아 러시아 우크라이나 전쟁 때문이구나.

2022년 러시아가 우크라이나를 침공했을 때 전 세계적으로 우크라이나 수도의 이름을 키예프에서 키이우로 바꾸자는 운동이 일어났다. 이 때문에 구글 지도를 비롯한 나무위키, 위키백과에서 모두 우크라이나어와 발음이 비슷한 키이우로 변경이 됐다. 타임존까지 영향을 주었구나.

회사에서 사용하고 있는 코파일럿에 해결 방법을 물어봤다. 내 예상과 비슷하게 답을 했다. JVM 버전을 올리거나 ‘IANA TZDB’ 업데이트하면 된다. IANA(Internet Assigned Numbers Authority)는 처음 들어 보는 키워드였다. IANA는 여러 가지 역할을 하는 기관인데, 여기서는 그중 하나가 타임존을 관리하는 것이라고 알고 넘어가자.

아래 주소에서 최신 타임존 데이터를 다운로드 받을 수 있다.

압축을 풀면 대륙별로 파일이 있다. europe 파일을 열어보니 예상한 대로 Europe/Kyiv 타임존이 있다. 문득 우리나라도 궁금해서 asia 파일도 열어 봤다.

아래는 서울과 평양에 해당하는 타임존 데이터다.

# Zone NAME STDOFF RULES FORMAT [UNTIL]

Zone Asia/Seoul 8:27:52 — LMT 1908 Apr 1

8:30 — KST 1912 Jan 1

9:00 — JST 1945 Sep 8

9:00 ROK K%sT 1954 Mar 21

8:30 ROK K%sT 1961 Aug 10

9:00 ROK K%sT

Zone Asia/Pyongyang 8:23:00 — LMT 1908 Apr 1

8:30 — KST 1912 Jan 1

9:00 — JST 1945 Aug 24

9:00 — KST 2015 Aug 15 00:00

8:30 — KST 2018 May 4 23:30

9:00 — KST

타임존 변화 기록으로 보인다. 코파일럿에 해석을 시켰더니 내 예상이 맞았다.

우리나라는 1908년까지 타임존 개념이 없었다. 이에 비해 일본(도쿄)은 1887년, 미국(뉴욕)은 1883년, 그리니치 천문대가 있는 영국(런던)은 1847년에 타임존 개념을 도입했다. 과학기술을 발전시키기 위해서는 표준화가 바탕에 있어야 한다. 타임존의 도입 시기부터 우리나라는 근대화에 뒤처졌다는 것을 알 수 있다.

더 슬픈 건 그다음이다.

국권피탈 시기 중 1912년부터 1945년까는 JST를 사용했다. 일본은 이렇게 우리의 주권을 철저하게 빼앗아 간 것이다. 1945년 광복 이후 약 한 달 만인 9월 8일에 다시 KST를 사용해 우리나라의 표준화 주권을 찾았다. 그 이후로 여러 정치, 경제적인 이슈로 08:30으로 갔다가 다시 지금 우리가 사용하고 있는 09:00로 이동했다.

북한은 우리보다 조금 이른 8월 24일에 JST에서 KST로 변경했다. 이때부터 남북 분단의 역사가 시작된다. 그리고 광복 70주년을 맞이해 평양 경도와 비슷한 08:30으로 시간대를 옮겼다. 다시 2018년 남북 화해 분위기로 우리와 같은 09:00로 옮겼다. 시간대는 먼저 통일을 이루었다.

또 IANA TZDB에는 서머타임(일광절약시간제) 변화 기록을 볼 수 있다.

# Rule NAME FROM TO — IN ON AT SAVE LETTER/S

Rule ROK 1948 only — Jun 1 0:00 1:00 D

Rule ROK 1948 only — Sep 12 24:00 0 S

Rule ROK 1949 only — Apr 3 0:00 1:00 D

Rule ROK 1949 1951 — Sep Sat>=7 24:00 0 S

Rule ROK 1950 only — Apr 1 0:00 1:00 D

Rule ROK 1951 only — May 6 0:00 1:00 D

Rule ROK 1955 only — May 5 0:00 1:00 D

Rule ROK 1955 only — Sep 8 24:00 0 S

Rule ROK 1956 only — May 20 0:00 1:00 D

Rule ROK 1956 only — Sep 29 24:00 0 S

Rule ROK 1957 1960 — May Sun>=1 0:00 1:00 D

Rule ROK 1957 1960 — Sep Sat>=17 24:00 0 S

Rule ROK 1987 1988 — May Sun>=8 2:00 1:00 D

Rule ROK 1987 1988 — Oct Sun>=8 3:00 0 S

가장 최근 서머타임은 1988년에 있었다. 88서울올림픽의 영향이다. 조금이라도 시각을 옮겨 북미, 유럽에서 편안하게 올림픽 경기를 시청하기 위함이라고 알고 있다.

여기서 개발자들이 알고 넘어가야 하는 중요한 부분이 있다. 서머타임이 시작될 때 시간의 연속성이 끊긴다. 1988년 5월 8일 오전 01:59:59 다음은 바로 오전 03:00:00 된다. 즉 우리나라에서는 1988년 5월 8일 오전 2시가 없다. 이것과 반대로 서머타임이 종료되는 시점에서는 중복 시간이 발생한다.

1988–05–08 01:59:59에서 1초를 더하는 소스코드다.

import java.time.*;
import java.time.format.DateTimeFormatter;

public class SeoulDSTTransitionExample {
    public static void main(String[] args) {
        ZoneId seoulZone = ZoneId.of("Asia/Seoul");
        LocalDateTime beforeDstTime = LocalDateTime.of(1988, 5, 8, 1, 59, 59);
        ZonedDateTime beforeDst = ZonedDateTime.of(beforeDstTime, seoulZone);
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss z");
        
        System.out.println("서머타임 시작 직전: " + beforeDst.format(formatter));
        ZonedDateTime afterDst = beforeDst.plusSeconds(1);
        System.out.println("서머타임 시작 직후: " + afterDst.format(formatter));
    }
}

결과는 아래처럼 나온다.

서머타임 시작 직전: 1988–05–08 01:59:59 KST

서머타임 시작 직후: 1988–05–08 03:00:00 KDT

신기하다. 정말 시간이 사라졌다!

만약 우리나라에서 타임존 시간대를 변경하거나 서머타임을 적용한다면 머릿속이 아득해진다. 우리 팀에서 운영하는 시스템에서 변경할 게 한둘이 아니다. 이런 걸 보면 미국 개발자들이 대단하다. 미국은 시간대도 다양하고, 매년 봄과 가을에 서머타임을 적용하고 해제한다.

시간 계산은 우리 일상에서 많이 사용해서 익숙하지만 파고들면 복잡한 구석이 많다. 지금 봤던 타임존, 서머타임부터 각종 역법, 윤년, 윤달. 그리고 지구 자전 속도에 변화를 보정하기 위해 만든 윤초까지.

시간은 단순히 메모리에 저장된 이진 데이터가 아니다. 그 속에는 과학기술부터 정치, 경제까지 다양한 역사가 들었다. 그리고 한 나라의 주권을 상징하기도 한다.

출처: https://www.cia.gov/the-world-factbook/static/8cbb754608abf37d2526feffbc44fef2/world_time.jpg