Unix 시간, POSIX 시간, 에포크 타임스탬프: 짧은 답
일상적인 코드에서 이 세 용어는 같은 숫자를 의미합니다. 1970-01-01 00:00:00 UTC 이후의 초입니다. 차이는 그 출처에 있습니다. "Unix 시간"은 초기 Unix와 C 라이브러리에서 물려받은 관례입니다. "POSIX 시간"은 같은 계수를 공식 표준(IEEE Std 1003.1)으로 적어 둔 것으로, 하루를 정확히 86,400초로 고정합니다. "에포크 타임스탬프"는 셋 중 가장 일반적입니다 — "에포크"는 단지 고정된 기준 시점이며, 거의 항상 1970년의 Unix 에포크를 뜻하지만 다른 시스템(NTP, GPS, Windows)은 다른 에포크부터 셉니다. 아래 표는 각 용어를 그 표준 및 윤초 처리 방식에 대응시킵니다.
| 용어 | 세는 것 | 정의 출처 | 윤초 | 비고 |
|---|---|---|---|---|
| Unix 시간 | 1970-01-01 00:00:00 UTC 이후의 초 | 관례(Unix / C 라이브러리) | 무시 | 개발자가 일상적으로 쓰는 이름 |
| POSIX 시간 | 고정 공식에 의한 에포크 이후의 초 | IEEE Std 1003.1 §4.16 | 무시 — 하루는 정확히 86,400초 | Unix 시간을 공식 사양화한 것 |
| 에포크 타임스탬프 | 고정 에포크(보통 Unix 에포크)로부터의 계수 | 일반 용어 — 에포크는 다양 | 에포크/시스템에 따라 다름 | "에포크"는 기준 시점이며 항상 1970년은 아님 |
| 에포크 밀리초 | 1970-01-01 UTC 이후의 밀리초 | 같은 에포크, 더 미세한 단위 | 무시 | 현재 13자리. JavaScript와 Java의 기본 |
에포크 타임스탬프란?
에포크 타임스탬프는 에포크라고 하는 고정 기준 시점부터 측정한 숫자 계수입니다. 개발자의 일상적 용법에서 에포크 타임스탬프는 보통 Unix 타임스탬프를 의미합니다 — 1970년 1월 1일 00:00:00 UTC 이후의 초입니다. 값이 0이면 정확히 Unix 에포크를 뜻합니다. 양수 값은 1970년 이후, 음수 값은 그 이전입니다. 핵심이 되는 단어는 "에포크"로, 시작 시점을 명명하며 나머지는 모두 거기서부터 세는 것일 뿐입니다. 단순한 정의와 타임스탬프 0의 의미는 "에포크 시간 설명"을 참고하세요. 이 글은 경쟁하는 세 이름이 어떻게 관련되는지에 초점을 둡니다.
Unix 시간 vs POSIX 시간: 표준은 무엇이라 말하나
Unix 시간과 POSIX 시간은 같은 계수를 가리키지만, 공식적으로 사양화된 것은 POSIX 시간뿐입니다. IEEE Std 1003.1 — POSIX 표준 — 은 UTC 달력 날짜를 하나의 정수로 변환하는 명시적 공식으로 "Seconds Since the Epoch"를 정의합니다. 그 공식의 결정적 성질은 하루를 정확히 86,400초(60 × 60 × 24)로 취급한다는 점입니다. 이는 의도된 단순화입니다. 윤초를 무시하여 천문학적 정확성을 포기하는 대신, 계산·정렬·저장이 간단한 값을 얻습니다. "Unix 시간"은 같은 양의 구어적 이름으로 표준보다 오래되었고, "POSIX 시간"은 정확한 정의가 필요할 때 인용하는 것입니다.
- POSIX 공식: UTC 날짜가 하나의 정수에 대응하고, 각 날은 86,400초로 고정
- 결과: Unix/POSIX 타임스탬프는 UTC를 따르지만 삽입된 윤초는 결코 세지 않음
- time_t는 이를 담는 C 타입 — 과거에는 부호 있는 32비트, 지금은 보통 부호 있는 64비트
- 같은 순간 → 시간대나 로케일과 무관하게 모든 준수 시스템에서 같은 값
Unix 시간과 POSIX 시간이 실제로 달라질 때가 있나?
거의 모든 소프트웨어에서는 아니요 — 같은 숫자이며 용어를 혼용할 수 있습니다. 차이는 시민 시간과 물리의 경계에서만 드러납니다. 둘 다 윤초를 무시하므로 Unix/POSIX 타임스탬프는 1970년 이후 경과한 SI 초의 실제 계수가 아닙니다. 1972년 이후 UTC에 삽입된 27회의 윤초를 포함하지 않습니다.(연속 원자 시간 척도인 TAI는 2017년 이후 정확히 37초 UTC보다 앞서 있습니다.) 윤초 전후에 POSIX 시계는 하루를 정확히 86,400초로 유지하기 위해 1초를 반복하거나 건너뜁니다. 대형 플랫폼은 이 불연속을 leap smearing(윤초 분산)으로 피합니다 — 추가 1초를 하루 전체에 분산시켜 어떤 타임스탬프도 모호하지 않게 합니다. 고정밀 타이밍, 윤초를 가로지르는 스케줄링, 또는 GPS나 TAI와의 비교를 한다면, 바로 그곳에서 "Unix"와 "POSIX"는 학문적이기를 멈추고 윤초 모델이 중요해집니다.
마주치게 될 다른 에포크들
"에포크 타임스탬프"가 "Unix 타임스탬프"를 의미하는 것은 관례일 뿐입니다. 에포크는 단지 시계가 세기 시작하는 순간이며, 널리 쓰이는 여러 시스템은 다른 에포크부터 셉니다. 어떤 값이 Unix 에포크로 2020년대의 그럴듯한 날짜로 디코딩되지 않는다면, 흔히 다른 에포크가 그 이유입니다.
- Unix / POSIX 에포크 — 1970-01-01 UTC; 초(또는 ms/µs). 거의 어디서나 기본값
- NTP 에포크 — 1900-01-01 UTC; Network Time Protocol(RFC 5905)에서 사용
- GPS 에포크 — 1980-01-06; GPS 시간에는 윤초가 없어 UTC보다 앞서 어긋났다(2026년 기준 18초)
- Windows FILETIME — 1601-01-01 UTC, 100나노초 간격으로 셈
- JavaScript / Java — Unix 에포크이지만 밀리초 단위라 그 값이 13자리
왜 1970년 기준 타임스탬프가 표준이 되었나
Unix 에포크는 초기 Unix 시스템에 실용적이었고, Unix의 아이디어가 C 라이브러리, Linux, 데이터베이스, 웹 서버, 프로그래밍 언어로 퍼지면서 관례가 되었습니다. 단일 숫자 타임스탬프는 지역화된 날짜 문자열보다 정렬·비교·전송·저장이 쉽습니다. C 라이브러리, 그리고 POSIX가 그 계수를 표준화하자 1970년은 생태계 전반에 고정되었습니다 — 그래서 한 플랫폼에서 생성한 값이 다른 어떤 플랫폼에서도 동일하게 디코딩됩니다.
에포크 타임스탬프 예시
몇 가지 알려진 값이 있으면 정의를 기억하기 쉽습니다.
- 0 = 1970-01-01 00:00:00 UTC
- 1 = 1970-01-01 00:00:01 UTC
- 86400 = 1970-01-02 00:00:00 UTC
- 1700000000 = 2023-11-14 22:13:20 UTC
- 1767225600 = 2026-01-01 00:00:00 UTC
관련 글
FAQ
- 에포크 시간은 Unix 시간과 같나요?
- 일반적인 개발자 용법에서는 그렇습니다. 에포크 시간은 보통 Unix 시간을 의미합니다. 1970-01-01 00:00:00 UTC 이후의 경과 초입니다.
- Unix 시간의 정의는 무엇인가요?
- Unix 시간은 윤초를 세지 않고 1970-01-01 00:00:00 UTC 이후의 초로 정의됩니다.
- POSIX 시간이란 무엇인가요?
- POSIX 시간은 Unix 시간을 공식적으로 사양화한 것입니다. IEEE Std 1003.1("Seconds Since the Epoch")은 1970-01-01 00:00:00 UTC 이후의 초를 세고 하루를 정확히 86,400초로 취급하는 정확한 공식을 제공합니다.
- 왜 POSIX 시간은 윤초를 무시하나요?
- 설계상의 이유입니다. POSIX 공식은 값을 계산하고 저장하기 쉽도록 하루를 정확히 86,400초로 고정합니다. 그 결과 Unix/POSIX 타임스탬프는 UTC를 따르지만 거기에 삽입된 윤초는 표현하지 않습니다.
- POSIX 타임스탬프는 시간대를 인식하나요?
- 아니요. POSIX 타임스탬프는 하나의 순간을 나타냅니다. 시간대는 그 순간을 읽을 수 있는 날짜로 형식화할 때만 적용됩니다.
- 에포크 타임스탬프는 Windows, Linux, macOS에서 같나요?
- Unix 에포크(1970-01-01 00:00:00 UTC)는 최신 플랫폼과 언어에서 동일하므로 같은 순간은 어디서나 같은 Unix 타임스탬프를 만듭니다. Windows는 내부적으로 자체 FILETIME 에포크(1601년)를 사용하지만, 표준 Unix 및 POSIX 타임스탬프는 1970년을 사용합니다.