API 응답에서 "created_at": 1745913600 같은 값을 본 적 있나요? 이 알 수 없어 보이는 정수가 바로 UNIX 타임스탬프입니다. 프로그래밍 세계에서 시간을 표현하는 표준 형식으로, 왜 존재하는지와 올바른 사용법을 이해하는 것은 모든 개발자가 갖춰야 할 기초 지식입니다.
1. UNIX 타임스탬프란?
UNIX 타임스탬프는 1970년 1월 1일 00:00:00 UTC(Unix Epoch)부터 특정 시점까지 경과한 초 수입니다. 예를 들어 1745913600은 2026년 4월 29일 00:00:00 UTC를 나타냅니다.
프로그램이 사람이 읽을 수 있는 문자열 대신 이 정수를 사용하는 이유는 세 가지입니다.
- 시간대 중립: 동일한 정수가 전 세계 모든 시스템에서 동일한 절대 시각을 의미하며 「서울 시간」과 「뉴욕 시간」의 모호함이 없습니다
- 계산 용이: 두 시점의 차이나 이벤트 순서 정렬이 정수 비교만으로 완결됩니다
- 형식 통일: 언어와 DB가 달라도 동일한 정수를 명확하게 해석할 수 있습니다
타임스탬프를 즉시 변환하세요: Unix 타임스탬프 변환 도구를 사용하면 타임스탬프와 사람이 읽을 수 있는 날짜 사이를 빠르게 변환하고, 주요 시간대별 대응 시간도 확인할 수 있습니다.
2. 초 vs 밀리초: 가장 흔한 혼동 함정
| 형식 | 예시 | 설명 |
|---|---|---|
| 초(seconds) | 1745913600 | 10자리 — UNIX 표준, C/Python/PHP 사용 |
| 밀리초(milliseconds) | 1745913600000 | 13자리 — JavaScript Date.now()가 반환하는 형식 |
| 마이크로초(microseconds) | 1745913600000000 | 16자리 — 일부 DB와 고정밀 시스템에서 사용 |
구별법: 자릿수를 확인하세요. 10자리 → 초, 13자리 → 밀리초. 13자리 타임스탬프를 초로 해석하면 서기 58,000년이라는 날짜가 나옵니다 — 초보자가 가장 자주 겪는 버그 중 하나입니다.
3. API 설계: 시간 필드 모범 사례
| 형식 | 예시 | 장점 | 단점 |
|---|---|---|---|
| UNIX 타임스탬프(초) | 1745913600 | 빠른 계산, 시간대 모호함 없음 | 사람이 읽기 어려움 |
| ISO 8601 문자열 | 2026-04-29T00:00:00Z | 사람이 읽기 쉬움, 시간대 정보 포함 | 언어별 파싱 방식이 다름 |
- 내부 API: 시간대 오해석 방지를 위해 정수 타임스탬프 우선 사용
- 공개 API: 개발자 가독성을 위해 ISO 8601 사용
- 항상 UTC로 저장·전송하고, 사용자 시간대로의 변환은 프런트엔드에서만 수행
시간대가 포함된 시간 문자열을 받았나요? 세계 시계 도구에서 각 시간대의 현재 시각을 빠르게 조회하고 시간대 변환이 올바른지 검증할 수 있습니다.
4. 데이터베이스 저장: INT·DATETIME·TIMESTAMP 선택
| 타입 | 예시 | 적합한 상황 | 주의사항 |
|---|---|---|---|
BIGINT | 1745913600 | 고성능 쿼리, DB 간 이식성 | 2038년 문제 방지를 위해 BIGINT 권장 |
DATETIME | 2026-04-29 00:00:00 | 사람이 읽기 좋은 저장 | MySQL DATETIME은 시간대 정보를 저장하지 않음 |
TIMESTAMP | 2026-04-29 00:00:00 | MySQL 자동 시간대 변환 | 2038년 상한(MySQL 8에서 일부 개선) |
2038년 문제: 32비트 부호 있는 정수의 최댓값은 2038년 1월 19일 03:14:07 UTC에 해당하며, 이를 넘으면 오버플로가 발생합니다. 64비트 정수(BIGINT)를 사용하면 수십억 년 후까지 안전합니다.
5. 다언어 타임스탬프 빠른 참조
JavaScript
const ms = Date.now(); // 밀리초 const sec = Math.floor(Date.now() / 1000); // 초 const date = new Date(1745913600 * 1000); // 타임스탬프 → Date const ts = Math.floor(date.getTime() / 1000); // Date → 타임스탬프(초)
Python
import time, datetime, timezone ts = time.time() dt = datetime.datetime.fromtimestamp(1745913600, tz=timezone.utc) ts = dt.timestamp()
PHP
$ts = time();
echo date('Y-m-d H:i:s', $ts);
$ts = strtotime('2026-04-29 00:00:00 UTC');
6. 흔한 실수 정리
| 실수 | 증상 | 해결책 |
|---|---|---|
| 밀리초를 초로 처리 | 서기 58,000년으로 표시 | 1000으로 나누거나 필드 단위 확인 |
| 로컬 시간을 UTC 필드에 저장 | 8시간 차이 발생(UTC+9) | 항상 UTC로 저장, 표시 시 변환 |
| 32비트 INT 사용 | 2038년 이후 오버플로 | BIGINT 사용 |
| 문자열 시간에 시간대 미지정 | 서버마다 해석이 달라짐 | ISO 8601에 Z 또는 +09:00 추가 |
정리
- 타임스탬프는 "1970-01-01 00:00:00 UTC부터의 경과 초"로 시간대에 독립적
- 10자리=초, 13자리=밀리초 — 혼동은 가장 흔한 버그 중 하나
- API 설계: 내부는 정수, 공개는 ISO 8601, 항상 UTC
- DB: BIGINT로 저장하여 2038년 문제 방지
- 모든 주요 언어에 변환용 표준 라이브러리가 있음