에포크 시간 설명: Unix 타임스탬프 0이란?
Unix 타임스탬프 0은 1970년 1월 1일 00:00:00 UTC입니다. 왜 그 날짜가 Unix 에포크가 되었는지, 음수 타임스탬프가 무엇을 나타내는지, 에포크 초/밀리초/마이크로초가 어떻게 다른지, 현대 시스템에 어떤 한계가 적용되는지 배웁니다.
Unix 타임스탬프 0이 나타내는 것
모든 Unix 타임스탬프는 단일 기준점인 1970년 1월 1일 00:00:00 UTC 이후 경과 시간을 셉니다. Unix의 원래 정의에서 단위는 초이므로 타임스탬프 0은 정확히 1970년 1월 1일 UTC 자정이고, 86400은 정확히 24시간 뒤입니다. 현대 시스템은 밀리초·마이크로초·나노초도 쓰지만 기준점은 같습니다. 모든 양수 값은 에포크 이후의 순간을, 모든 음수 값은 그 이전의 순간을 나타냅니다.
왜 1970년 1월 1일인가?
이 날짜는 1970년대 초 벨 연구소의 Unix 개발자들이 Unix 자체 탄생 직전의 실용적 기준점으로 선택했습니다. 일반적인 시스템 타임스탬프가 양수가 될 만큼 이르고, 초기 컴퓨터의 작은 정수 범위에 들어갈 만큼 최근이며, 암산으로 확인할 만큼 단순해야 했습니다. Unix가 영향력을 갖자 언어, 운영체제, 데이터베이스, 로그 형식, 네트워크 프로토콜이 같은 시작점을 물려받았습니다.
- Unix는 1969년부터 벨 연구소에서 개발됨 — 에포크는 그 직전으로 설정됨
- 1월 1일은 깔끔한 달력 경계로 선택됨
- 구현이 0에서 시작하는 카운터를 사용했기에 1969년이 아니라 1970년
- 현대의 모든 OS·언어·프로토콜이 이 에포크를 물려받음 — 경쟁 표준은 없음
음수 타임스탬프: 1970년 이전 날짜
음수 Unix 타임스탬프는 1970년 1월 1일 00:00:00 UTC 이전의 순간을 나타냅니다. 대부분의 현대 64비트 시스템은 이를 올바르게 지원하며, 역사 데이터, 생년월일, 보관 기록, 그리고 Unix보다 이른 에포크를 가진 시스템과의 상호운용에 유용합니다. 오래된 라이브러리와 데이터베이스는 음수를 거부할 수 있으므로 역사적 데이터셋은 명시적 호환성 점검이 필요합니다.
- -1 = December 31, 1969 23:59:59 UTC (one second before the epoch)
- -86400 = December 31, 1969 00:00:00 UTC (one day before the epoch)
- -2208988800 = January 1, 1900 00:00:00 UTC
- JavaScript: new Date(-86400 * 1000).toISOString() → '1969-12-31T00:00:00.000Z'
형식의 실용적 한계
Unix 에포크 자체가 한계가 아니라 저장 타입이 한계입니다. 32비트 부호 있는 정수에 저장된 타임스탬프는 64비트 정수, JavaScript 숫자, 데이터베이스 네이티브 timestamp 타입보다 훨씬 일찍 무너집니다. 타임스탬프 안전성을 평가할 때는 어떤 단위인지와 어떤 숫자 타입으로 저장되는지를 모두 물으세요.
- 32-bit signed integer max: 2,147,483,647 = January 19, 2038 03:14:07 UTC (the Year 2038 problem)
- JavaScript Date max: 8,640,000,000,000,000 ms = September 13, 275760 CE
- 64-bit signed integer max: ~9.2 × 10^18 seconds = year ~292 billion
- PostgreSQL TIMESTAMPTZ max: January 1, 294276 CE
다른 시스템의 에포크
Unix가 컴퓨팅에서 쓰이는 유일한 에포크는 아닙니다. 다른 시스템들은 역사적·기술적 이유로 자체 기준점을 정의했습니다.
- GPS 에포크: 1980년 1월 6일 00:00:00 UTC — GPS 위성과 수신기가 사용
- Windows FILETIME: 1601년 1월 1일 00:00:00 UTC — 100나노초 간격
- Apple Cocoa / NSDate: 2001년 1월 1일 00:00:00 UTC
- Excel / Lotus 1-2-3: 1900년 1월 1일 — Lotus 호환을 위한 의도적 윤년 버그 포함
- FAT 파일 시스템: 1980년 1월 1일 00:00:00 로컬 시간
에포크 초·밀리초·마이크로초·나노초
timestamp라는 단어가 항상 단위를 알려주지는 않습니다. Unix 초는 운영체제와 백엔드 언어에서, Unix 밀리초는 JavaScript와 브라우저 API에서 흔합니다. 마이크로초와 나노초는 데이터베이스, 트레이싱 시스템, 고해상도 로그에 나타납니다. 단위는 정밀도와 보이는 자릿수를 모두 결정합니다.
- Seconds: 1700000000 — common in Python, PHP, Go, Ruby, C, and Unix command-line tools
- Milliseconds: 1700000000000 — common in JavaScript Date and many web analytics systems
- Microseconds: 1700000000000000 — common in some databases and event pipelines
- Nanoseconds: 1700000000000000000 — common in high-resolution tracing and systems languages
- Always document the unit when storing epoch values in APIs, CSV files, and database columns
에포크 시간 vs UTC vs 로컬 시간
에포크 시간은 카운트입니다. UTC는 기준 순간을 정의하는 전 세계 시간 표준입니다. 로컬 시간은 America/New_York이나 Asia/Tokyo 같은 시간대에 기반한 표시 선택입니다. Unix 타임스탬프는 사용자가 이동해도 바뀌지 않으며, 포맷된 달력 날짜와 시각만 바뀝니다.
- 같은 타임스탬프도 시간대가 다르면 다른 로컬 날짜로 표시될 수 있음
- UTC 출력은 로그, API, 서버 간 디버깅에 가장 좋음
- 로컬 출력은 달력, UI, 보고서에 가장 좋음
- 시간대 오프셋은 포맷 시 적용되며 Unix 타임스탬프 안에 저장되지 않음
에포크 시간 FAQ
- 에포크 시간은 항상 초인가요?
- 고전적인 Unix 타임스탬프는 1970-01-01 00:00:00 UTC 이후의 초이지만, 많은 시스템은 같은 에포크로 밀리초·마이크로초·나노초를 씁니다.
- Unix 타임스탬프가 1970년 이전 날짜를 나타낼 수 있나요?
- 예. 음수 타임스탬프는 Unix 에포크 이전 날짜를 나타내지만, 오래된 라이브러리와 데이터베이스는 지원하지 않을 수 있습니다.
- Unix 타임스탬프에 시간대가 포함되나요?
- 아니요. Unix 타임스탬프는 UTC의 한 순간을 나타냅니다. 시간대 정보는 그 순간을 읽기 쉬운 로컬 날짜로 변환할 때만 사용됩니다.
- Unix 타임스탬프의 최댓값은?
- 에포크가 아니라 저장 타입에 따라 다릅니다. 32비트 부호 있는 정수는 최대 2,147,483,647(2038년 1월 19일)이고, 64비트 정수나 JavaScript 숫자는 수억 년에 이릅니다. 자세한 내용은 2038년 문제를 참고하세요.