서버 로그에 1709251200이라는 숫자가 찍혀 있다. 날짜 같기도 하고 아닌 것 같기도 한데, 이건 2024년 3월 1일 00:00:00(UTC)을 의미하는 Unix 타임스탬프다. 1970년 1월 1일 자정부터 경과한 초(秒)를 숫자 하나로 표현한 것이다.
Unix 타임스탬프의 원리
컴퓨터가 시간을 다루는 가장 기본적인 방식이다. 기준점(Epoch)인 1970년 1월 1일 00:00:00 UTC부터 지금까지 흘러간 초를 정수로 표현한다.
| 타임스탬프 | 날짜 (UTC) | 의미 |
|---|---|---|
| 0 | 1970-01-01 00:00:00 | Unix Epoch 기준점 |
| 946684800 | 2000-01-01 00:00:00 | 밀레니엄 |
| 1709251200 | 2024-03-01 00:00:00 | 예시 날짜 |
| 2147483647 | 2038-01-19 03:14:07 | 32비트 한계 (Y2K38 문제) |
초(seconds)와 밀리초(milliseconds)
타임스탬프 숫자의 자릿수를 보면 단위를 구분할 수 있다.
- 10자리 (예: 1709251200): 초 단위. Unix/Linux 시스템, PHP, Python에서 기본으로 쓴다.
- 13자리 (예: 1709251200000): 밀리초 단위. JavaScript(Date.now()), Java(System.currentTimeMillis())에서 쓴다.
TIP 13자리 타임스탬프를 10자리 시스템에 넣으면 서기 56,000년쯤 날짜가 나온다. 단위를 잘못 넣은 것이니 끝 3자리를 잘라내면 된다.
타임스탬프를 날짜로 바꾸는 법
타임스탬프 변환기에 숫자를 넣으면 로컬 시간, UTC, ISO 8601 세 가지 형식으로 날짜가 표시된다. 반대로 날짜를 입력해서 타임스탬프 숫자를 얻을 수도 있다. 현재 시각의 타임스탬프가 실시간으로 표시되니 API 테스트 시 바로 복사해서 쓸 수 있다.
개발 실무에서 타임스탬프를 쓰는 이유
- 시간대(timezone) 독립적
- "2026-03-01 09:00"은 한국 시간인지 미국 시간인지 알 수 없다. 타임스탬프는 UTC 기준 절대값이라 시간대 혼동이 없다.
- 비교와 정렬이 쉬움
- 문자열 날짜를 비교하려면 파싱이 필요하다. 타임스탬프는 숫자 비교 한 번으로 선후가 결정된다.
- 저장 공간 효율
- "2026-03-01T09:00:00+09:00" (25바이트) vs 1709251200 (10바이트). 대량 데이터에서 차이가 커진다.
주의할 점
- Y2K38 문제: 32비트 정수로 표현 가능한 최대 타임스탬프는 2038년 1월 19일이다. 이후로는 오버플로가 발생한다. 64비트 시스템에서는 문제없다.
- 음수 타임스탬프: 1970년 이전 날짜는 음수로 표현된다. 1969-12-31은 -86400이다.
- 윤초: Unix 타임스탬프는 윤초를 무시한다. 정밀한 시간 측정이 필요한 시스템에서는 별도 처리가 필요하다.
로그 분석이든 API 디버깅이든, 타임스탬프를 읽을 줄 알면 시간 관련 버그를 잡는 속도가 확실히 빨라진다.