-
Notifications
You must be signed in to change notification settings - Fork 7
tzfile(5)
tzfile - 시간대 정보
tzset(3)에서 쓰는 시간대 정보 파일들은 보통 /usr/share/zoneinfo
같은 이름의 디렉터리 아래에 있다. 그 파일들은 다음 필드들을 담은 44바이트 헤더로 시작한다.
-
시간대 정보 파일임을 나타내는 4바이트짜리 ASCII 열 "TZif".
-
파일 형식 버전을 나타내는 한 바이트. (2017년 현재 ASCII NUL이거나, "2"이거나, "3".)
-
향후 용도를 위해 예비된 0을 담은 15바이트.
-
표준 바이트 순서(값의 상위 바이트 먼저)로 기록된 4바이트짜리 정수 값 여섯 개. 그 값들은 차례로 다음과 같다.
tzh_ttisgmtcnt
- 파일에 저장된 UT/로컬 표시자 수.
tzh_ttisstdcnt
- 파일에 저장된 표준/벽시계 표시자 수.
tzh_leapcnt
- 파일에 데이터 항목이 저장돼 있는 윤초 수.
tzh_timecnt
- 파일에 데이터 항목이 저장돼 있는 전환 시간 수.
tzh_typecnt
- 파일에 데이터 항목이 저장돼 있는 지역 시간 종류 개수. (0이 아니어야 함.)
tzh_charcnt
- 파일에 저장된 시간대 축약명 문자열들의 바이트 수.
위 헤더 다음으로 다음 필드들이 오는데, 헤더 내용에 따라 길이가 정해진다.
-
오름차순으로 정렬된 4바이트 부호 있는 정수 값
tzh_timecnt
개. 이 값들은 표준 바이트 순서로 기록된다. 지역 시간 계산 규칙이 바뀌는 전환 시간으로 쓰인다. (time(2) 반환 값으로 나타냄.) -
1바이트 부호 없는 정수 값
tzh_timecnt
개. 파일에 기술된 여러 지역 시간 종류들 중 어느 게 같은 인덱스의 전환 시간부터 다음 전환 시간 전까지의 기간에 연계돼 있는지 알려 준다. (단 마지막 시간 종류 항목은 아래 기술된 POSIX 스타일 TZ 문자열과의 일관성 검사를 위해 있을 뿐이다.) 이 값들이 다음 필드에서 인덱스 역할을 한다. -
다음처럼 정의된
ttinfo
항목tzh_typecnt
개.struct ttinfo { int32_t tt_gmtoff; unsigned char tt_isdst; unsigned char tt_abbrind; };
각 구조체는 표준 바이트 순서로 된 4바이트 부호 있는 정수 값
tt_gmtoff
, 1바이트 값tt_isdst
, 1바이트 값tt_abbrind
로 이뤄진다. 각 구조체에서tt_gmtoff
는 UT에 더해야 할 초 수이고,tt_isdst
는 localtime(3)에서tm_isdst
를 설정해야 하는지 여부를 나타내며,tt_abbrind
는 파일에서ttinfo
구조체(들) 다음에 오는 시간대 축약명 문자열 배열에서의 인덱스 역할을 한다. -
표준 바이트 순서로 된 4바이트 값
tzh_leapcnt
쌍. 각 쌍의 첫 번째 값은 윤초가 일어나는 음수 아닌 시간이고 (time(2) 반환 값으로 나타냄), 두 번째는 그 시간부터의 기간 동안에 적용할 윤초 총 개수이다. 시간 오름차순으로 쌍들이 저장돼 있다. 각 전환은 양수 또는 음수 1초 만큼의 윤초이며, 전환 간에는 항상 최소 28일 빼기 1초만큼의 간격을 둔다. -
1바이트 값으로 저장된 표준/벽시계 표시자
tzh_ttisdstcnt
개. 지역 시간 종류와 연계된 전환 시간들이 표준 시간과 벽시계 시간 중 어느 쪽으로 지정돼 있는지 나타낸다. POSIX 방식 시간대 환경 변수들을 다루는 과정에서 시간대 파일을 이용할 때 쓰인다. -
1바이트 값으로 저장된 UT/지역 표시자
tzh_ttisgmtcnt
개. 지역 시간 종류와 연계된 전환 시간들이 UT 시간과 지역 시간 중 어느 쪽으로 지정돼 있는지 나타낸다. POSIX 방식 시간대 환경 변수들을 다루는 과정에서 시간대 파일을 이용할 때 쓰인다.
tzh_timecnt
가 0이거나 시간 인자가 파일에 기록돼 있는 첫 번째 전환 시간보다 앞인 경우에 localtime(3) 함수는 파일의 첫 번째 표준 시간 ttinfo
구조체를 (표준 시간 구조체가 없으면 그냥 첫 번째 ttinfo
구조체를) 사용한다.
버전 2 형식의 시간대 파일에서는 위의 헤더 및 데이터 다음에 두 번째 헤더 및 데이터가 오는데, 전환 시간과 윤초 시간에 각각 8바이트를 쓴다는 점을 빼곤 동일한 형식이다. (윤초 개수는 여전히 4바이트다.) 두 번째 헤더 및 데이터 다음에는 개행으로 감싼 POSIX TZ 환경 변수 스타일 문자열이 오는데, 파일에 저장된 마지막 전환 시간 후의 순간들을 (파일에 전환이 없다면 모든 순간들을) 처리할 때 쓰기 위한 것이다. 그 순간들에 대한 POSIX 표현이 존재하지 않는 경우에는 POSIX 스타일 TZ 문자열이 비어 있다. (즉 개행 사이에 아무것도 없다.) POSIX 스타일 TZ 문자열이 비어 있지 않은 경우에는 그 여덟 바이트 데이터로 된 전환 시간이 있다면 마지막 전환 시간 후의 지역 시간 종류와 그 TZ 문자열이 부합해야 한다. 예를 들어 그 문자열이 "WET0WEST,M3.5.0,M10.5.0/3"라고 하고, 마지막 전환 시간이 7월에 있다면 그 전환의 지역 시간 종류에서 UT보다 한 시간 동쪽이고 "WEST"로 줄여 쓰는 일광 절약 시간을 명시해야 한다. 또한 전환이 최소 한 번은 있을 때 무한대 과거부터 가장 이른 전환 시간 전까지의 기간에는 시간 종류 0번이 연계된다.
버전 3 형식의 시간대 파일에서는 newtzset(3)
에서 기술하는 POSIX TZ 형식에 대한 두 가지 소규모 확장을 그 POSIX TZ 스타일 문자열에서 쓸 수 있다. 첫째로, 전환 시간의 시간 부분이 POSIX에서 요구하는 0에서 24까지의 부호 없는 값이 아니라 -167에서 167까지 범위의 부호 있는 값일 수 있다. 둘째로, DST가 1월 1일 00:00에 시작해서 12월 31일 24:00에 일광 절약 시간과 표준시 차이를 더한 때에 끝나는 경우에는 DST가 연중 내내 효력이 있다.
향후 형식이 바뀌면서 더 많은 데이터가 덧붙을 수 있다.
time(2), localtime(3), tzset(3), tzselect(8)
, zdump(8)
, zic(8)
2019-03-06