서버 로그를 열었더니 시간이 1709251200으로 찍혀 있다. 2024년 몇 월 며칠인지 이 숫자만 봐서는 알 수가 없다. 이게 Unix 타임스탬프다. 개발을 하면 매일 마주치는데, 원리를 모르면 매번 검색하게 된다.
Unix 타임스탬프가 뭔가
1970년 1월 1일 00:00:00 UTC(Epoch)부터 경과한 초 단위 숫자다. 이 기준점을 Epoch라고 부른다.
0= 1970년 1월 1일 00:00:00 UTC86400= 1970년 1월 2일 (하루 = 60 × 60 × 24초)1709251200= 2024년 3월 1일 00:00:00 UTC
시간대(timezone)가 없는 순수한 숫자이기 때문에 전 세계 어디서든 같은 타임스탬프는 같은 순간을 가리킨다. 이 점이 개발에서 타임스탬프를 선호하는 핵심 이유다.
왜 날짜 대신 숫자를 쓰나
- 시간대 혼동 방지
- "2026-03-01 09:00"이 한국 시간인지 미국 시간인지 모호하다. 타임스탬프는 절대 시각이라 오해가 없다.
- 비교와 정렬이 쉽다
- 두 시각의 선후를 판단할 때 숫자 크기만 비교하면 된다. 날짜 문자열을 파싱할 필요가 없다.
- 저장 공간이 작다
- "2026-03-01T09:00:00+09:00" 같은 문자열보다 정수 하나가 훨씬 가볍다.
- 연산이 간단하다
- 3일 후 = 타임스탬프 + 259200 (86400 × 3). 날짜 라이브러리 없이도 계산이 된다.
초 vs 밀리초, 어떻게 구분하나
같은 시각이라도 단위에 따라 자릿수가 다르다.
| 단위 | 자릿수 | 예시 |
|---|---|---|
| 초(seconds) | 10자리 | 1709251200 |
| 밀리초(milliseconds) | 13자리 | 1709251200000 |
JavaScript의 Date.now()는 밀리초를 반환하고, Python의 time.time()은 초 단위(소수점 포함)를 반환한다. API 문서에서 타임스탬프 단위를 반드시 확인해야 한다.
변환하는 방법
타임스탬프 변환기에서 숫자를 입력하면 로컬 시간, UTC, ISO 8601 형식 세 가지로 변환된다. 반대로 날짜와 시간을 선택하면 초/밀리초 타임스탬프가 나온다. 현재 시각의 타임스탬프는 화면 상단에 실시간으로 갱신되면서 표시된다.
코드로 변환하기
// JavaScript
new Date(1709251200 * 1000).toISOString()
// → "2024-03-01T00:00:00.000Z"
// Python
from datetime import datetime
datetime.utcfromtimestamp(1709251200)
// → 2024-03-01 00:00:00
참고 2038년 1월 19일에 32비트 시스템의 타임스탬프가 오버플로우된다(2³¹ - 1 = 2,147,483,647). Y2K38 문제라고 불리며, 64비트 시스템에서는 해당하지 않는다. 대부분의 현대 시스템은 이미 64비트로 전환됐다.
타임스탬프는 개발자가 시간을 다루는 가장 기본적인 방법이다. 숫자 하나로 전 세계 어디서든 같은 시각을 가리킬 수 있다는 점이 이 단순한 체계의 장점이다.