개요
프로그램 개발을 하면서 항상 제대로 알고있는건지 의심하게 되는, 사소할 수 있는 정보를 한번 정리해봤다. 예를들어 한국의 국가-언어 코드는 ko-kr(ko_KR)이고, 한글은 유니코드 또는 EUC-KR 인코딩 방식을 사용하고, 시간표기에서 Asia/Seoul(UTC+0900) 시간대에 속해있다. 이 문서는 이 중에서 Timezone을 표기하는 표준에 대한 내용을 담고있다.
시간대
시간대는 영국 그리니치 천문대의 위치를 기준으로 삼고있다. 즉, GMT = UTC+0000인 것이다. 여기에서 동쪽으로 갈 수록 시간대가 +로 표기되고 서쪽으로 갈 수록 시간대가 -로 표시된다. 이 시간대는 태평양 한가운데에 아주 복잡하게 -10, -11, +13, -12, +12 등이 뒤섞여있고, 다시 경도에 따라 시간대가 얼추 나눠진다. 세계지도에서 시간대를 표기한 표는 이렇게 생겼다.

지도를 잘 보면 아주 복잡하게 선이 나뉘는 것을 알 수 있는데, 정치적인 부분도 하나의 원인일 것으로 보인다. ISO 8601 표기법을 자세히보면 timezone을 표기할 때는 시, 분을 같이 표기하고 있다. 이것은 비슷한 경도라도 더 정밀하게 시간대를 구분해야 할 필요가 있기 때문으로 보인다.
또한 IANA에서 관리하고있는 timezone database를 뒤져보면 한국의 시간대와 표기에 몇번의 변화가 있었음을 알 수 있다.
| Offset | Rules | Until |
|---|---|---|
| 08:27:52 | LMT | 1908-04-01 |
| 08:30 | KST | 1912-01-01 |
| 09:00 | JST | 1945-09-08 |
| 09:00 | KST | 1954-03-21 |
| 08:30 | KST | 1961-08-10 |
| 09:00 | KST |
한국의 시간대는 일본 도쿄를 기준으로 하는 시간대에 편입되어 같이 지정되었던 이후로 거의 변화가 없다. 따라서 현재 한국의 시간대는 +0900라고 표기한다. 그리고 중요한건 아니지만, 북한의 시간대의 이름은 Asia/Pyongyang이고 KST와 동일하다.
파이썬에서의 Timezone
파이썬3의 날짜, 시간모듈은 datetime인데, 여기에는 ISO 8601 표준에서 정의하고있는 시간표기방법을 모두 지원하고 있다. 그러나 문제는 python3의 표준라이브러리에서는 timezone database 정보가 빠져있다. 따라서 개발자가 서비스를 운영하려는 지역의 timezone offset을 모두 알고 적용하 지원하지 못하는 문제가 있다. 따라서 3.8 버전까지는 Stuart Bishop(stuart@stuartbishop.net) 라는 사람이 개발한 pytz라는 모듈이 거의 필수모듈처럼 사용되고있었다. 3.9로 버전업되면서 IANA의 timezone database를 참고로 하는 zoneinfo라는 모듈이 추가되었다. 그래서 시간대를 다루는 코드는 python 3.8까지의 코드와 python 3.9까지의 코드가 약간 달라지게 된다.
-
예) python 3.8에서 한국 시간대(+09:00) 표기
# without pytz from datetime import datetime, timezone, timedelta kst = timezone(timedelta(hours=9)) # datetime.datetime(2022, 3, 4, 13, 0, 0, 0, tzinfo=datetime.timezone(datetime.timedelta(seconds=32400)) print(datetime.now(tz=kst)) # with pytz from datetime import datetime import pytz kst = pytz.timezone('Asia/Seoul') # datetime(2022, 3, 4, 13, 0, 0, 0, tzinfo=<DstTzInfo 'Asia/Seoul' KST+9:00:00 STD>) print(datetime.now(tz=pytz.timezone("Asia/Seoul"))) -
예) python 3.9에서 한국 시간대 표기
import datetime import zoneinfo kst = zoneinfo.ZoneInfo("Asia/Seoul") # datetime(2022, 3, 4, 13, 0, 0, 0, tzinfo=zoneinfo.ZoneInfo(key='Asia/Seoul')) print(datetime.now(tz=kst))
pytz 패키지는 timezone database를 바탕으로 하고있는 프로젝트이기 때문에 database를 관리하고있는 IANA의 정보가 업데이트 되는데 맞춰서 패키지 업데이트가 이뤄지고있다. 그리고 3.9에서부터 추가된 zoneinfo 객체는 /usr/share/zoneinfo 경로에서 갖고있는 데이터베이스 값을 가져오도록 되어있다. 또한 osx의 경우에는 /usr/share/zoneinfo -> /var/db/timezone/tz/{version}/zoneinfo 경로에 가면 데이터를 확인할 수 있다.