API 응답에 "created_at": 1709251200이 찍혀 있다. 2024년 몇 월 며칠인지 바로 알 수 있는 사람은 거의 없다. 이 숫자가 Unix 타임스탬프, 정확히는 Epoch 시간이다.
Unix 타임스탬프의 원리
1970년 1월 1일 00:00:00 UTC를 기준점(Epoch)으로 삼고, 거기서 경과한 초(seconds)를 정수로 표현한 것이다. 예를 들어 0은 1970년 1월 1일, 1000000000은 2001년 9월 9일이다.
- 초 단위 (10자리)
1709251200→ 2024년 3월 1일 00:00:00 UTC- 밀리초 단위 (13자리)
1709251200000→ 같은 시각이지만 밀리초 정밀도. 자바스크립트의Date.now()가 이 형태를 반환한다
자릿수만 보면 초인지 밀리초인지 바로 구분할 수 있다. 10자리면 초, 13자리면 밀리초다.
왜 날짜 대신 숫자를 쓰는가
"2024-03-01 09:00:00"이라는 문자열은 사람이 읽기엔 편하지만, 컴퓨터에게는 비교와 계산이 번거롭다. 타임스탬프를 쓰면 이런 장점이 있다.
- 시간대(timezone) 독립: 서울이든 뉴욕이든 같은 순간을 같은 숫자로 표현한다
- 정렬과 비교가 쉽다: 두 시점의 차이는 단순 뺄셈이면 된다
- 저장 공간 절약: 문자열 "2024-03-01T00:00:00Z"는 20바이트, 정수 1709251200은 4바이트
- 포맷 혼란 없음: MM/DD/YYYY인지 DD/MM/YYYY인지 고민할 필요가 없다
개발할 때 자주 쓰는 타임스탬프 변환
| 언어/환경 | 현재 타임스탬프 얻기 | 날짜로 변환 |
|---|---|---|
| JavaScript | Math.floor(Date.now()/1000) | new Date(ts * 1000) |
| Python | int(time.time()) | datetime.fromtimestamp(ts) |
| MySQL | UNIX_TIMESTAMP() | FROM_UNIXTIME(ts) |
주의 자바스크립트의 Date.now()는 밀리초 단위다. 서버에서 받은 초 단위 타임스탬프를 그대로 넣으면 1970년 1월 며칠로 나온다. 반드시 1000을 곱해야 한다.
로그나 API 응답에서 바로 확인하기
디버깅 중에 타임스탬프를 만날 때마다 코드를 짜서 변환하기는 번거롭다. 타임스탬프 변환기에 숫자를 붙여넣으면 로컬 시간, UTC, ISO 8601 형식이 한 번에 나오고, 반대로 날짜를 입력해서 타임스탬프를 뽑는 것도 된다. 현재 시각의 타임스탬프가 실시간으로 갱신되니까, 테스트 데이터 만들 때 바로 복사해서 쓰면 된다.
2038년 1월 19일 03:14:07 UTC, 32비트 시스템에서 타임스탬프가 오버플로우되는 이른바 "Y2K38 문제"의 시점이다. 아직 시간은 있지만, 레거시 시스템을 운영 중이라면 한 번쯤 점검해볼 만하다.