유닉스 시간

유닉스 계열, 또는 POSIX를 준수하는 운영체제에서 사용하는 시각 표기. 일반적으로 유닉스 시간이라고 하는 것은 C에서 time_t의 값으로, 표준 C에서는 이 값의 의미를 전혀 정의하지 않지만1) POSIX에서는 이 값을 명확히 정의하고 있다. 정확한 정의는:

1970-01-01T00:00:00Z UTC로 정의된 기원으로부터 지난 시간을 단위로 근사하는 값2)

이다. 이 정의가 UTC와 일대일 대응이 되지 않고 근사하도록 정의된 이유는 유닉스 시간을 윤초를 무시하고 UTC 표현으로부터 간단한 계산만으로 구할 수 있도록 되어 있기 때문이다. 그러하니 당연히 윤초가 추가될 때는 윤초 직전의 초와 윤초의 유닉스 시간 값이 겹치고, 윤초가 빠질 때는 빠진 윤초에 해당하는 유닉스 시간 값을 건너 뛰게 된다. 윤초를 건너 뛰는 것 뿐만이 아니라 현재 기원(1970년)은 UTC가 현재의 형태로 정착된 때(1972년)보다 이전이라 1972년 이전에 해당하는 유닉스 시간은 잘 정의되어 있지 않다고 할 수 있다.

이런 저런 문제에도 불구하고 유닉스 시간은 유닉스 계열 운영체제 뿐만 아니라 많은 프로그래밍 언어파일 포맷, 프로토콜 등에서 사용하고 있다. 이 중 32비트로 유닉스 시간을 표현하는 시스템에서는 "2038년 문제"라 불리는 Y2K 뺨치는 문제가 생길 예정이다. (time_t부호없는정수이면 좀 더 시간을 벌 수 있겠지만, 호환성 등의 문제로 보통 부호 있는 정수를 쓰기 때문에 시간을 벌기는 어렵다.)

오버플로

유닉스 시간이 특정 값을 넘겼을 때 생기는 문제는 소프트웨어 버그의 온상이 되고 있다. 예를 들어,

1) 심지어 단조증가하지 않아도 적법하며, 실제로 POSIX 표준에 따르면 윤초가 추가될 때 유닉스 시간은 단조증가하지 않는다.
2) POSIX:2001 이후의 정의. 이전 버전은 윤년에 대한 처리에 큰 문제가 있었다.