TIME2POSIX(3)

명칭
time2posix, posix2time - 기준 시점으로부터의 초수를 변환

프로그램 라이브러리
libc

서식
<time.h> time_t time2posix(const time_t *t) time_t posix2time(const time_t *t)

해설
p1003.1-88 (은)는, 536457599 라고 하는 time_t 치를 "1986 년 12 월 31 일 23:59:59" 에 대응시키도록(듯이) 규정하고 있습니다. 이것은, 실제상 POSIX 의 time_t 가 윤초를 포함하지 못하고, 따라서 시스템 시간은 윤초가 일어날 때마다 조정할 필요가 있는 것을 의미하고 있습니다.

그렇지만, 시간 패키지의 윤초 서포트가 유효하게 설정되어 있다 경우는, 이러한 조정은 필요가 없고, time_t 치는 윤초가 일어나도 올바르게 (진정한 「…으로부터의 초수」로) 진행됩니다. 이것은, 이러한 값이 기준 시점 이후에 삽입되었다 알맹이의 윤초만 POSIX 에 의해 요구되는 값과 다른 것을 의미합니다.

통상은, 타입 time_t 는 (대부분의 경우) 불투명해서 — 즉 time_t 치는 time(3), localtime(3), mktime(3), difftime(3) 등의 함수로부터 마셔 취득해, 또 그러한 함수에만 건네주도록(듯이) 생각되고 있으므로 — 이것은 문제가 되지 않습니다. 그렇지만, p1003.1-88 (은)는, 일자/시간부터 time_t 치를 직접 계산하는 수식을 주고 있어 프로그램에 따라서는 이 관계를 전제 조건으로 하고 있는 것이 있습니다. 통상, 이 관계를 사용해 time_t 의 작성/분석을 실시하고 있는 프로그램에서는, 윤초를 걸치는 간격을 올바르게 처리할 수 없습니다.

time2posix() 및 posix2time() 함수는, 로컬의 time_t 치와 거기에 상당하는 POSIX 등가의 값과의 사이에 변환을 실시해, 이 time_t 의 미스매치에 대응하기 위해서 준비된 것입니다. 이것은, 윤초의 삽입이나 삭제에 응해 POSIX 시스템에 일어난 타임 베이스 변경의 회수를 센다 것에 따라 실시합니다. 이러한 변환치는, 낡은 어플리케이션을 정정하는 대신에, 혹은 POSIX 준거 시스템과 통신할 경우에 이용할 수가 있습니다.

time2posix() 함수는 단일의 값을 가집니다. 즉, 모든 로컬의 time_t 는, 단일의 POSIX time_t 에 대응합니다. posix2time() 함수의 동작은, 그만큼 예의범절 좋지 않습니다. 정의 윤초를 만나면(자) 그 결과는 1 개에는 안되어, 또 부의 윤초에 대해서는 대응하는 time_t 가 존재하지 않기 위해(때문에) 거기에 가까운 값이 돌려주어집니다. 이러한 2 개의 예는, POSIX 에 의한다 표현의 결함도를 나타내는 좋은 지표라고 말할 수 있습니다.

다음의 겉(표)는, 1993 년 6 월말에 삽입된 윤초에 대해서, time_t 와 그 POSIX 표현에의 변환치, 및 그것을 재변환해 되돌린 값과의 관계를 나타냅니다.
DATE | TIME | T | X=time2posix(T) | posix2time(X)
93/06/30 | 23:59:59 | A+0 | B+0 | A+0
93/06/30 | 23:59:60 | A+1 | B+1 | A+1 or A+2
93/07/01 | 00:00:00 | A+2 | B+1 | A+1 or A+2
93/07/01 | 00:00:01 | A+3 | B+2 | A+3

윤초 삭제는 다음과 같이 됩니다.
DATE | TIME | T | X=time2posix(T) | posix2time(X)
??/06/30 | 23:59:58 | A+0 | B+0 | A+0
??/07/01 | 00:00:00 | A+1 | B+2 | A+1
??/07/01 | 00:00:01 | A+2 | B+3 | A+2

    [주: posix2time(B+1) => A+0 or A+1]

윤초 서포트가 유효하게 되지 않은 경우는, 로컬의 time_t 와 POSIX 의 time_t 는 등가가 되어, time2posix() 및 posix2time() 함수는 함께 항등 함수가 됩니다.

관련 항목
difftime(3), localtime(3), mktime(3), time(3)